链接:

https://www.luogu.org/problem/P3796

题意:

有NN个由小写字母组成的模式串以及一个文本串TT。每个模式串可能会在文本串中出现多次。你需要找出哪些模式串在文本串TT中出现的次数最多。

思路:

字典树的每个结束节点记录对应的模板串标号, 匹配时记录次数.

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
//#include <memory.h>
#include <queue>
#include <set>
#include <map>
#include <algorithm>
#include <math.h>
#include <stack>
#include <string>
#include <assert.h>
#include <iomanip>
#include <iostream>
#include <sstream>
#define MINF 0x3f3f3f3f
using namespace std;
typedef long long LL;
const int MAXN = 2e6+10; struct Trie
{
int Next[26];
int End;
int Fail;
void Init()
{
memset(Next, 0, sizeof(Next));
End = Fail = 0;
}
}trie[MAXN];
int cnt, n, pos, maxt;
int Ans[MAXN];
char s[MAXN], Pt[200][100]; void Insert(char *t, int id)
{
int len = strlen(t);
int p = 0;
for (int i = 0;i < len;i++)
{
if (trie[p].Next[t[i]-'a'] == 0)
{
trie[p].Next[t[i]-'a'] = ++cnt;
trie[cnt].Init();
}
p = trie[p].Next[t[i]-'a'];
}
trie[p].End = id;
} void BuildAC()
{
queue<int> que;
for (int i = 0;i < 26;i++)
{
if (trie[0].Next[i] != 0)
que.push(trie[0].Next[i]);
}
while (!que.empty())
{
int u = que.front();
que.pop();
for (int i = 0;i < 26;i++)
{
if (trie[u].Next[i])
{
trie[trie[u].Next[i]].Fail = trie[trie[u].Fail].Next[i];
que.push(trie[u].Next[i]);
}
else
trie[u].Next[i] = trie[trie[u].Fail].Next[i];
//压缩路径, 没有的点直接指向别的节点, 减少向上找的时间
}
}
} void Query(char *qs)
{
int len = strlen(qs);
int p = 0;
for (int i = 0;i < len;i++)
{
p = trie[p].Next[qs[i]-'a'];
for (int j = p;j != 0 && trie[j].End != -1;j = trie[j].Fail)
{
//将所有能出现的匹配都跑一遍, 同时处理防止多跑.
if (trie[j].End != 0)
{
Ans[trie[j].End]++;
maxt = max(maxt, Ans[trie[j].End]);
}
}
}
} int main()
{
while (~scanf("%d", &n) && n)
{
memset(Ans, 0, sizeof(Ans));
cnt = pos = maxt = 0;
trie[0].Init();
for (int i = 1;i <= n;i++)
{
scanf("%s", Pt[i]);
Insert(Pt[i], i);
}
scanf("%s", s);
BuildAC();
Query(s);
if (maxt <= 0)
puts("0");
else
{
printf("%d\n", maxt);
for (int i = 1;i <= n;i++)
{
if (Ans[i] == maxt)
puts(Pt[i]);
}
}
} return 0;
}

最新文章

  1. openstack-swift云存储部署(一)
  2. SQL Server 2014 安装图解
  3. JavaScript函数编程-Ramdajs
  4. tree view
  5. Nao 类人机器人 相关资料
  6. 【转载】关于Python中的yield
  7. github上所有项目的受欢迎程度排名,包括超大型项目
  8. 更换VS2012序列号的方法
  9. POJ2528 线段树的区间操作
  10. Linux中tshark(wireshark)抓包工具使用方法详解
  11. 在head标签里加一个meta标签让指定ie使用特定内核 解决css在ie中的兼容性问题
  12. Samsung K9F1G08U0D SLC NAND FLASH简介(待整理)
  13. JDBC结果集rs.next()注意事项
  14. python字符集的转换(mysql数据乱码的处理)
  15. jQuery时间格式插件-moment.js的使用
  16. 多进程multiprocessing
  17. 数据分析---《Python for Data Analysis》学习笔记【03】
  18. [转] Immutable 常用API简介
  19. go-ehtereum编译:
  20. vuejs_01项目启动

热门文章

  1. NIT校赛-- 雷顿女士与平衡树
  2. php 连接webservice接口
  3. 分享一些JVM常见的面试题(转)
  4. S03_CH02_AXI_DMA PL发送数据到PS
  5. ideaIU-2019.2.exe-安装目录和设置目录结构的说明
  6. python经典小程序集锦(一) 实现九九乘法表
  7. Redis 的订阅发布(PUB/SUB)示例
  8. JS的日期的知识与格式化
  9. 1.DOS常用命令
  10. YOLO 学习之路