询问有多少个模式串出现在了文本串里面。将模式串插入Trie树中,然后跑一边AC自动机统计一下就哦了。

献上一份模板。

#include <cstdio>
#include <cstring>
#include <queue>
#define MAX_NODE 240005
#define MAX_CHILD 26
using namespace std; class AC_Automaton {
public:
int chd[MAX_NODE][MAX_CHILD];
int fail[MAX_NODE];
int val[MAX_NODE];
int ID[128];
int sz;
queue<int> q; AC_Automaton() {
for (int i = 0; i < 26; i++)
ID[i + 'a'] = i;
Clear();
} void Clear() {
memset(chd, 0, sizeof (chd));
memset(fail, 0, sizeof (fail));
memset(val, 0, sizeof (val));
sz = 1;
} void Insert(const char *s) {
int cur = 1;
for (int i = 0; s[i]; i++) {
if (!chd[cur][ID[s[i]]]) chd[cur][ID[s[i]]] = ++sz;
cur = chd[cur][ID[s[i]]];
}
val[cur]++;
} void Build_AC() {
while (!q.empty()) q.pop();
q.push(1);
fail[1] = 1;
while (!q.empty()) {
int cur = q.front();
q.pop();
for (int i = 0; i < MAX_CHILD; i++)
if (chd[cur][i]) {
if (cur == 1) fail[chd[cur][i]] = 1;
else {
int tmp = fail[cur];
while (tmp != 1 && chd[tmp][i] == 0) tmp = fail[tmp];
if (chd[tmp][i]) fail[chd[cur][i]] = chd[tmp][i];
else fail[chd[cur][i]] = 1;
}
q.push(chd[cur][i]);
}
}
} int Query(const char *s) {
int ret = 0;
int cur = 1, tmp;
for (int i = 0; s[i]; i++) {
if (chd[cur][ID[s[i]]]) cur = chd[cur][ID[s[i]]];
else {
while (cur != 1 && chd[cur][ID[s[i]]] == 0) cur = fail[cur];
if (chd[cur][ID[s[i]]]) cur = chd[cur][ID[s[i]]];
}
tmp = cur;
while (tmp != 1 && val[tmp] != -1) {
ret += val[tmp];
val[tmp] = -1;
tmp = fail[tmp];
}
}
return ret;
}
} AC; char s[60], text[1000001]; int main() {
int T, n;
scanf("%d", &T);
while (T--) {
scanf("%d", &n);
AC.Clear();
while (n--) {
scanf(" %s", s);
AC.Insert(s);
}
AC.Build_AC();
scanf(" %s", text);
printf("%d\n", AC.Query(text));
}
return 0;
}

最新文章

  1. ORBSLAM2与OPENCV3.1.0出错解决办法
  2. HDU 4287 Intelligent IME(字典树数组版)
  3. 编译mod_jk.so
  4. javaWEB中的ServletRequest,ServletResponse的使用,及简化Servlet方法
  5. sqlserver 空间数据类型
  6. My blog
  7. MapReuce 编程总结-多MapReduce执行
  8. android简单的计算器
  9. CSS3中transform几个属性值的注意点
  10. webservice时间类型XMLGregorianCalendar和Date的转换
  11. 机器学习基石:02 Learning to Answer Yes/No
  12. Allegro导入PADS文件
  13. 开启mysql-binlog日志操作步骤
  14. 再谈 C# 对象二进制序列化,序列化并进行 AES 加密
  15. Brocade SAN交换机常用命令
  16. python网页爬虫开发之六-Selenium使用
  17. 25. instr用法
  18. Matlab 中以分数显示结果
  19. java基础(九) 可变参数列表介绍
  20. 记一次Apache Carbondata PR的经历

热门文章

  1. Java 容器的打印
  2. SQL SERVER 触发器介绍
  3. 20165203《Java程序设计》第七周Java学习总结
  4. 数据图表插件echarts(二)
  5. C# 文件存在,但是File.Exists 判断不存在的问题
  6. pip-django-cms
  7. elastucasearch基础理论以及安装
  8. Ionic Js四:复选框
  9. 基于 Laravel 开发博客应用系列 —— 设置 Windows 本地开发环境
  10. 安装 Git