博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【AC自动机】[UESTC 554][USACO 2012]Video Game Combos
阅读量:4925 次
发布时间:2019-06-11

本文共 1990 字,大约阅读时间需要 6 分钟。

题目大意:给定有ABC组成的串n个,然后请你生成一个长度为K的串求给定的串在生成串中最多被匹配时的次数

输入

3 7

ABA
CB
ABACB

输出:

4

题目解析:这道题目就是对于每一个节点每次处理下一个(第N+1)个是什么字母,然后每次匹配确定当前字符一定有用(一定存在下一个模式串)然后进行匹配的同时进行DP就行了(保证每个节点到根的串被匹配否则不就浪费长度了么。。)

#include 
#include
#include
#include
#include
using namespace std;#define rep(i,k) for(int (i)=1;(i)<=(k);(i)++)#define repz(i,k) for(int (i)=0;(i)<(k);(i)++)const int MAXN = 20;const int MAXK = 1000;struct State{ int fail, flag; int ch[3];}p[MAXN*15+30];int scnt, Bef[MAXN*15+30];void Add(char *s){ int now = 0, len = strlen(s); repz(i, len){ if(!p[now].ch[s[i]-'A']) p[now].ch[s[i]-'A'] = ++scnt; now = p[now].ch[s[i]-'A']; } p[now].flag++;}void _initTree(){ queue
que; repz(i, 3) if(p[0].ch[i]) que.push(p[0].ch[i]); while(!que.empty()){ int u = que.front(); que.pop(); repz(i, 3) if(p[u].ch[i]){ int v = p[u].ch[i]; que.push(v); int k = p[u].fail; while(k && !p[k].ch[i]) k = p[k].fail; p[v].fail = p[k].ch[i]; Bef[v] = p[p[v].fail].flag > 0 ? p[v].fail : Bef[p[v].fail]; } }}int dp[MAXK+10][MAXN*15+30];void match(int len){ memset(dp, -1, sizeof dp); dp[0][0] = 0; queue
> que; que.push(make_pair(0, 0)); pair
tmp; while(!que.empty()){ tmp = que.front(); que.pop(); int u = tmp.first; int ru = u, i = tmp.second; if(i == len) break; repz(ids, 3){ u = ru; if(p[u].ch[ids]) u = p[u].ch[ids]; else{ int k = p[u].fail; while(k && !p[k].ch[ids]) k = p[k].fail; u = p[k].ch[ids]; } if(!u) continue; int k = u, sum = 0; while(k){ sum += p[k].flag; k = Bef[k]; } if(dp[i][ru] + sum > dp[i+1][u]){ dp[i+1][u] = dp[i][ru] + sum; que.push(make_pair(u, i+1)); } } } int ans = 0; scnt++; repz(i, scnt) ans = max(ans, dp[len][i]); printf("%d\n", ans);}int main(){ int n, k; char s[40]; scanf("%d%d", &n, &k); rep(i, n){ scanf("%s", s); Add(s); } _initTree(); match(k); return 0;}

转载于:https://www.cnblogs.com/JeremyGJY/p/5921646.html

你可能感兴趣的文章
javascript 简单认识
查看>>
tomcat 系统架构与设计模式 第二部分 设计模式 转
查看>>
scanf中的%[^\n]%*c格式
查看>>
启动Eclipse报Initializing Java Tooling错误解决方法
查看>>
用jquery来实现类似“网易新闻”横向标题滑动的移动端页面
查看>>
(原)基于物品的协同过滤ItemCF的mapreduce实现
查看>>
CSS可以和不可以继承的属性
查看>>
eclipse每次当我按ctrl+鼠标点击代码,自动关闭,产生原因及解决办法!!
查看>>
hbase
查看>>
用PHP将Unicode 转化为UTF-8
查看>>
HDOJ1002 A+B Problem II
查看>>
ADB server didn't ACK(adb不能开启
查看>>
网页内容抓取
查看>>
分布式和集群的区别
查看>>
Python基础(三)
查看>>
Sql server在cmd下的使用
查看>>
【BZOJ 1019】 1019: [SHOI2008]汉诺塔 (DP?)
查看>>
织梦DEDECMS系统中文章内容为空 用SQL语句如何删除?
查看>>
load data导入数据之csv的用法
查看>>
silverlight调用MVC WebApi方法
查看>>