传送门

默认大家都学过trie与AC自动机。

先求出fail,对于每个节点维护一个sum,sum[u]待表从根到u所形成的字符串能拿到几分。显然sum[u]=sum[fail] + (u是几个字符串的结尾)。

设dp[i][j]代表长度为i到trie树上的j号节点所得的最大分数,显然有dp[i+1][j的字符k儿子] = max{dp[i+1][j的字符k儿子], dp[i][j] + sum[j的字符k儿子]}

memset(dp, -, sizeof(dp));
dp[][] = ;
for (int i = ; i <= k; i++) {
for (int j = ; j <= tot; j++) {
if (dp[i - ][j] == -) continue;
for (int l = ; l < ; l++) {
dp[i][trie[j][l]] = max(dp[i][trie[j][l]], dp[i - ][j] + sum[trie[j][l]]);
}
}
}

然后答案就是max{dp[k][i]},i是所有trie树上的节点。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int n, k;
char s[];
int tu[][];
int trie[][], tot = ;
int fail[], sum[];
int dp[][];
queue<int> q;
int main() {
scanf("%d%d", &n, &k);
for (int i = , len; i <= n; i++) {
scanf("%s", s + );
len = strlen(s + );
int p = ;
for (int j = ; j <= len; j++) {
int m = s[j] - 'A';
if (!trie[p][m]) trie[p][m] = ++tot;
p = trie[p][m];
}
sum[p]++;
}
for (int i = ; i < ; i++) trie[][i] = ;
fail[] = ;
q.push();
while (!q.empty()) {
int p = q.front(); q.pop();
for (int i = ; i < ; i++) {
if (trie[p][i]) {
fail[trie[p][i]] = trie[fail[p]][i];
sum[trie[p][i]] += sum[fail[trie[p][i]]];
q.push(trie[p][i]);
} else {
trie[p][i] = trie[fail[p]][i];
}
}
}
memset(dp, -, sizeof(dp));
dp[][] = ;
for (int i = ; i <= k; i++) {
for (int j = ; j <= tot; j++) {
if (dp[i - ][j] == -) continue;
for (int l = ; l < ; l++) {
dp[i][trie[j][l]] = max(dp[i][trie[j][l]], dp[i - ][j] + sum[trie[j][l]]);
}
}
}
int ans = -;
for (int i = ; i <= tot; i++) {
ans = max(ans, dp[k][i]);
}
cout << ans;
return ;
}

最新文章

  1. 【基础知识】UML基础
  2. MySQL的left join中on与where的区别
  3. Swing圆角边框的实现
  4. wpf 资源的重用
  5. 一个简单的flask程序
  6. [转]How to create an anonymous IDA PRO database (.IDB)
  7. sqlalchemy相关知识
  8. ggplot2 geom相关设置—点重合处理(jitter)
  9. python线程与进程手记
  10. Python 获取当前脚本文件路径目录
  11. C语言博客作业--嵌套循环
  12. Python简单基础小程序
  13. 基于 HTML5 的 WebGL 楼宇自控 3D 可视化监控
  14. win server 2008 R2 支持
  15. PAT甲题题解-1009. Product of Polynomials (25)-多项式相乘
  16. SaltStack 使用 Jinja2 模板
  17. bootstrap3中模态框的数据编辑使用方法
  18. TFS2010 分支问题
  19. jquery.chosen.js下拉选择框美化插件项目实例
  20. siebel简介

热门文章

  1. C语言:将形参s所指字符串中所有ASCII码值小于97的字符存入形参t所指字符数组中,
  2. Codeforces 1313C.Skyscrapers
  3. 基于Tesseract实现图片文字识别
  4. C++的new&amp;delete
  5. webpack原理类型问题
  6. STM32F4/F7运算性能
  7. JS动态添加删除html
  8. python requirements.txt批量下载安装离线
  9. Lucene的初步了解和学习
  10. Git - 删除github上的提交历史