博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 2222 Keywords Search(AC自己主动机模板题)
阅读量:6348 次
发布时间:2019-06-22

本文共 1967 字,大约阅读时间需要 6 分钟。

题意:给出一个字符串和若干个模板,求出在文本串中出现的模板个数。

思路:由于有可能有反复的模板,trie树权值记录每一个模板出现的次数就可以。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define eps 1e-6#define LL long long#define pii (pair
)//#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;const int maxn = 1000000 + 100;const int SIGMA_SIZE = 26;const int maxnode = 1000000+100;int n, ans;bool vis[maxn];map
ms;int ch[maxnode][SIGMA_SIZE+5]; int val[maxnode]; int idx(char c) {return c - 'a';}struct Trie { int sz; Trie() { sz = 1; memset(ch[0], 0, sizeof(ch[0])); memset(vis, 0, sizeof(vis)); } void insert(char *s) { int u = 0, n = strlen(s); for(int i = 0; i < n; i++) { int c = idx(s[i]); if(!ch[u][c]) { memset(ch[sz], 0, sizeof(ch[sz])); val[sz] = 0; ch[u][c] = sz++; } u = ch[u][c]; } val[u]++; } }; //ac自己主动机int last[maxn], f[maxn];void print(int j) { if(j && !vis[j]) { ans += val[j]; vis[j] = 1; print(last[j]); }} int getFail() { queue
q; f[0] = 0; for(int c = 0; c < SIGMA_SIZE; c++) { int u = ch[0][c]; if(u) { f[u] = 0; q.push(u); last[u] = 0; } } while(!q.empty()) { int r = q.front(); q.pop(); for(int c = 0; c < SIGMA_SIZE; c++) { int u = ch[r][c]; if(!u) { ch[r][c] = ch[f[r]][c]; 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 find_T(char* T) { int n = strlen(T); int j = 0; for(int i = 0; i < n; i++) { int c = idx(T[i]); j = ch[j][c]; if(val[j]) print(j); else if(last[j]) print(last[j]); } } char tmp[105]; char text[1000000+1000]; int main() { //freopen("input.txt", "r", stdin); int T; cin >> T; while(T--) { scanf("%d", &n); Trie trie; ans = 0; for(int i = 0; i < n; i++) { scanf("%s", tmp); trie.insert(tmp); } getFail(); scanf("%s", text); find_T(text); cout << ans << endl; } return 0; }

转载地址:http://efvla.baihongyu.com/

你可能感兴趣的文章
SQL注入测试工具:Pangolin(穿山甲)
查看>>
在html 的img属性里只显示图片的部分区域(矩形,给出开始点和结束点),其他部份不显示,也不要拉伸...
查看>>
程序员第二定律:量化管理在程序员身上永无可能
查看>>
ubuntu一些脚本的执行顺序
查看>>
类继承的结构
查看>>
Intel 被 ARM 逼急了
查看>>
testng + reportng 测试结果邮件发送
查看>>
神操作:如何将Vim变成一个R语言IDE
查看>>
百度亮相iDASH,推动隐私保护在人类基因组分析领域的应用
查看>>
比特币暴涨拉升至1w美元以上,说比特币崩盘的专家要失望了
查看>>
Python「八宗罪」
查看>>
你的隐私还安全吗?社交网络中浏览历史的去匿名化
查看>>
NeurIPS 2018|如何用循环关系网络解决数独类关系推理任务?
查看>>
Windows 10 份额突破 40%,Windows 7 连跌四月终回升
查看>>
怎么把Maven项目转为动态Web项目?
查看>>
Arm发布Cortex-A76AE自动驾驶芯片架构,宣示车载系统市场主权
查看>>
FreeBSD ports中make可带有的参数(转)
查看>>
Hibernate入门教程
查看>>
Java支付宝扫码支付[新]
查看>>
SpringMVC 拦截器 筛选
查看>>