第一道\(AC\)自动机\(+DP.\)

首先,一个自动机上\(DP\)的套路是设\(dp[i][j]\)表示长度为\(i\)匹配到\(j\)节点的最优得分。

那么,由于我们已经建好了\(Trie\)图,我们就应该提前把走到节点\(j\)的所有连击操作处理出来。

有一条显然结论:如果在\(fail\)树上经过了这个串结尾节点中子树中的任意一点,则这次匹配一定会包含这个串。

换句话说,我们在对每一个节点更新\(fail\)的时候,其分值应该直接把其\(fail\)的分值加上。

于是我们进行\(dp.\)

首先初始值都是\(-inf,\)但对于匹配节点在根的情况应该是\(0.\)

至于为什么\(dp[0][*]\)不能赋值为\(0,\)是因为根本不可能存在这种状态。匹配长度为\(0\)不可能匹配到其他节点。

但初始时,不管哪一个节点和\(0\)匹配,其一定不会有任何分数。根节点本身是一个空节点。

解决初始值问题,我们可以进行\(dp.\)

枚举长度,枚举节点,再枚举字符。对于一个状态,我们应该取所有能到达这个状态的\(dp\)值的\(\max.\)因为我只能输入\(k\)个字符。

剩下的就是模板了。

#include<bits/stdc++.h>
using namespace std;
int dp[5000][2000];
const int MAXN=4000;
int pos[MAXN],cnt[MAXN];
int tot,n;
char st[MAXN];
struct Tree{
int ch[3],fail;
}T[MAXN];
vector<int>to[MAXN];
int num[MAXN];
int insert(char *str,int len){
int u=0;
for(int i=0;i<len;++i){
int x=str[i]-'A';
if(!T[u].ch[x])T[u].ch[x]=++tot;
u=T[u].ch[x];
}
num[u]++;return u;
}
void bfs(){
queue<int>q;
for(int i=0;i<3;++i){
if(T[0].ch[i]){
int v=T[0].ch[i];
T[v].fail=0;
q.push(v);
}
}
while(!q.empty()){
int u=q.front();q.pop();
for(int i=0;i<3;++i){
if(T[u].ch[i]){
int v=T[u].ch[i];
T[v].fail=T[T[u].fail].ch[i];
q.push(v);
}
else T[u].ch[i]=T[T[u].fail].ch[i];
}
to[T[u].fail].push_back(u);
num[u]+=num[T[u].fail];
}
}
int K; int main(){
scanf("%d%d",&n,&K);
for(int i=1;i<=n;++i){
scanf("%s",st);
int L=strlen(st);
pos[i]=insert(st,L);
}
bfs();
memset(dp,128,sizeof(dp));
for(int i=0;i<=K;++i)dp[i][0]=0;
for(int i=1;i<=K;++i){
for(int j=0;j<=tot;++j){
for(int k=0;k<3;++k){
dp[i][T[j].ch[k]]=max(dp[i][T[j].ch[k]],dp[i-1][j]+num[T[j].ch[k]]);
}
}
}
int ans=0;
for(int i=0;i<=tot;++i)ans=max(ans,dp[K][i]);
printf("%d\n",ans);
return 0;
}

最新文章

  1. Myeclipse 不能保存汉字
  2. 直接拿来用!最火的Android开源项目(完结篇)
  3. SQL查询 - 表连接
  4. 如何使VS2008 调试网站的根目录和IIS调试的一致?
  5. MIFARE系列5《存储结构》
  6. Nginx+uWSGI+Django原理
  7. vim自动补全:go
  8. 转:MVC分页
  9. cf471A MUH and Sticks
  10. OC基础15:内存管理和自动引用计数
  11. [转]android中解析后台返回的json字符串
  12. Flash安全的一些总结
  13. 单表ORM框架
  14. 有关java的引用传递,直接操作对象本身。直接删除BE的value中某值
  15. docker 部署nginx
  16. 使用JUnit进行类的测试(一)
  17. TCP和UDP协议的比较
  18. dubbo-001--前言
  19. Java第三阶段学习(六、多线程)
  20. centos 7 系统启动不了 出现报错dependency failed for /mnt , dependency failed for local file systems

热门文章

  1. 《神经网络的梯度推导与代码验证》之FNN(DNN)前向和反向过程的代码验证
  2. iOS打电话功能的简单实现
  3. MySQL 增删查改 必知必会
  4. sqlserver语句的执行顺序
  5. 【微信小程序】常用组件及自定义组件
  6. [LeetCode]621. 任务调度器(贪心)
  7. Jmeter(二十三) - 从入门到精通 - JMeter函数 - 上篇(详解教程)
  8. 我把公司 10 年老系统改造 Maven,真香!!
  9. Dubbo工作流程
  10. Guava Cache详解