好久没有写博客了,好惭愧啊……虽然这是一道弱题但还是写一下吧。

这道题目的思路应该说是很容易形成:字符串+最大值?自然联想到学过的AC自动机与DP。对于给定的字符串建立出AC自动机,dp状态dp[i][j]则表示第i位(我们求的字符串的第i位),匹配到自动机的第j位所能获得的最大值。只需要沿儿子节点与fail指针转移即可。

#include <bits/stdc++.h>
using namespace std;
#define maxn 1005
int n, m, ans, cnt;
int dp[maxn][maxn], ch[maxn][], tag[maxn * ], fail[maxn * ];
string s; void Gmax(int &x, int y)
{
if(y > x) x = y;
} void Trie_Ins()
{
int len = s.length(), now = ;
for(int i = ; i < len; i ++)
{
if(!ch[now][s[i] - 'A']) ch[now][s[i] - 'A'] = ++ cnt;
now = ch[now][s[i] - 'A'];
}
tag[now] += ;
} void AC_Build()
{
queue <int> q;
for(int i = ; i < ; i ++)
if(ch[][i]) q.push(ch[][i]);
while(!q.empty())
{
int u = q.front(); q.pop();
for(int i = ; i < ; i ++)
{
if(ch[u][i])
{
fail[ch[u][i]] = ch[fail[u]][i];
tag[ch[u][i]] += tag[fail[ch[u][i]]];//注意不是加1哦
q.push(ch[u][i]);
}
else ch[u][i] = ch[fail[u]][i];
}
}
} void DP()
{
dp[][] = ;
for(int i = ; i <= m; i ++)
for(int j = ; j <= cnt; j ++)
{
if(dp[i - ][j] == -) continue;
for(int k = ; k < ; k ++)
{
if(ch[j][k]) Gmax(dp[i][ch[j][k]], dp[i - ][j] + tag[ch[j][k]]);
else Gmax(dp[i][fail[ch[j][k]]], dp[i - ][j] + tag[fail[ch[j][k]]]);
}
}
} int main()
{
scanf("%d%d", &n, &m);
memset(dp, -, sizeof(dp));
for(int i = ; i <= n; i ++)
{
cin >> s;
Trie_Ins();
}
AC_Build();
DP();
for(int i = ; i <= cnt; i ++) ans = max(ans, dp[m][i]);
printf("%d\n", ans);
return ;
}

最新文章

  1. PX 和PT的区别
  2. Java应用程序项目的打包与发行(run.bat形式)
  3. [转]java web简单权限管理设计
  4. 【iCore3 双核心板_ uC/OS-III】例程二:任务的建立与删除
  5. 10,SFDC 管理员篇 - 流程自动化
  6. 关于TouchEvent里面的touches,targetTouches,changedTouches的解释
  7. Studio之版本管理工具Git (图文教程)
  8. Hibernate解决高并发问题之:悲观锁 VS 乐观锁
  9. JSP技术的优缺点介绍
  10. 第一个嵌入汇编的C程序
  11. [置顶] 如何更改CSDN博客高亮代码皮肤的样式,使博客看起来更有范(推荐)
  12. Spark配置&amp;启动脚本分析
  13. iOS 购物—个人中心界面
  14. 【LeeetCode】4. Median of Two Sorted Arrays
  15. 一个基于EntityFramework Core的简单数据库访问层,适用于轻量级数据库业务
  16. JavaScript(第三天)【数据类型】
  17. 灰度发布/AB test
  18. 【leetcode】657. Robot Return to Origin
  19. Codeforces 1036E Covered Points (线段覆盖的整点数)【计算几何】
  20. 11个教程中不常被提及的JavaScript小技巧

热门文章

  1. js实现前端的搜索历史记录
  2. 浅谈C#实现Web代理服务器的几大步骤
  3. flask 中访问时后台错误 error: [Errno 32] Broken pipe
  4. 什么是mysql数据库安全 简单又通俗的mysql库安全简介
  5. Node.js中的不安全跳转如何防御详解
  6. P3305 [SDOI2013]费用流
  7. Sql Server 游标概念与实例
  8. pxe无人值守安装linux机器笔记----摘抄
  9. Unity3d脚本生命周期
  10. ionic 向路由中的templateUrl(模板页)传值