放上刘汝佳的模板:

 #include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
using namespace std; const int maxnod = * + ; int n;
char str[][], T[];
map<string, int> mp; struct AC_Automata {
int ch[maxnod][];//Trie树转移
int cnt[];//每个子串出现了几次
int val[maxnod];//某节点是否为子串结尾以及是哪个串的结尾
int f[maxnod];//失配,转移到别的树枝继续找
int last[maxnod];//找到了后缀相同的其他可行子串
int sz; void init() {
sz = ;
mp.clear();//与ac自动机无关
memset(ch[], , sizeof ch[]);
memset(cnt, , sizeof cnt);
} int idx(char c) { return c - 'a'; } void insert(char* s, int v) {//Trie树的插入
int u = , n =strlen(s);
for (int i = ; i < n; ++i) {
int c = idx(s[i]);
if (!ch[u][c]) {
memset(ch[sz], , sizeof ch[sz]);
val[sz] = ;
ch[u][c] = sz++;
}
u = ch[u][c];
}
val[u] = v;
} void getfail() {
queue<int> Q;
f[] = ;
for (int i = ; i < ; i++) {
int u = ch[][i];
if (u) {
f[u] = last[u] = ;
Q.push(u);
}
}
while (!Q.empty()) {
int r = Q.front(); Q.pop();
for (int c = ; c < ; c++) {
int u = ch[r][c];
if (!u) continue;
Q.push(u);
int v = f[r];
while (v && !ch[v][c]) v = f[v];//当前这个不行看看别人行不行
f[u] = ch[v][c];
last[u] = val[f[u]] ? f[u] : last[f[u]];
}
}
} void Success(int j) {
if (j) {
cnt[val[j]]++;
Success(last[j]);
}
} void find(char* T) {
int n = strlen(T);
for (int i = , j = ; i < n; ++i) {
int c = idx(T[i]);
while (j && !ch[j][c]) j = f[j];
j = ch[j][c];
if (val[j]) Success(j);
else if (last[j]) Success(last[j]);
}
}
}ac; int main() {
while (~scanf("%d", &n) && n) {
ac.init();
for (int i = ; i <= n; i++) {
scanf("%s", str[i]);
ac.insert(str[i], i);
mp[str[i]] = i;
}
ac.getfail();
scanf("%s", T);
ac.find(T); int ans = -;
for (int i = ; i <= n; i++) {
ans = max(ans, ac.cnt[i]);
}
printf("%d\n", ans);
for (int i = ; i <= n; i++) {
if (ac.cnt[mp[str[i]]] == ans) puts(str[i]);
}
}
return ;
}

最新文章

  1. JSP之WEB服务器:Apache与Tomcat的区别 ,几种常见的web/应用服务器
  2. POJ1160 Post Office[序列DP]
  3. Java——新IO 缓冲区与Buffer
  4. 浅谈JavaScript中的闭包
  5. [转]Caffe在Linux下的安装,编译,实验
  6. 夺命雷公狗TP下关联查询
  7. LeetCode Median of Two Sorted Arrays 找中位数(技巧)
  8. vs 2005中解决找不到模板项
  9. Android 多线程 异步加载
  10. dialog获取焦点
  11. 【SICP感应】1 工艺和替代模式
  12. codeblocks设置代码黑色主题
  13. http协议发送post请求
  14. 学习MeteoInfo二次开发教程(八)
  15. JDBC(2)—Statement
  16. 基于 Spark 的文本情感分析
  17. Linux下用文件IO的方式操作GPIO(/sys/class/gpio)(转)
  18. mdadm 软RAID
  19. 深入理解java虚拟机(八)类加载过程详解
  20. git之删除过滤

热门文章

  1. this、call和apply、bind
  2. layer弹出层不居中解决方案,仅显示遮罩,没有弹窗
  3. Python开发【2.2 异常处理】
  4. 三张图教你生成一个Android jar 库。
  5. intellij IDEA 更新java后不用重启tomcat
  6. 根据查询出各地订单商品数量 group by
  7. ie67 display:inline-block 失效解决方法
  8. ERROR: cannot start Android Studio. No JDK found. Please validate either ANDROID_STUDIO_JDK, JDK_HOME + Unrecognized VM option &#39;+UseCodeCacheFlushing
  9. (linux)MMC 卡驱动分析
  10. lstat函数的使用【学习笔记】