博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU2222 Keywords Search
阅读量:4928 次
发布时间:2019-06-11

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

ac自动机裸题,但我还是写的trie图。

还有,访问过的点要打标记,不然会tle。

代码:

#include
#include
#include
#include
using namespace std;int T,n,tot;char s[60],st[1000050];struct Trie{ int ch[28]; int f,w,vis;}tr[500500];void init(){ for(int i=0;i<=tot;i++) { tr[i].f = tr[i].w = tr[i].vis = 0; for(int j=1;j<=26;j++) tr[i].ch[j] = 0; } tot=0;}void trie_pic(){ queue
q; for(int i=1;i<=26;i++) if(tr[0].ch[i]) q.push(tr[0].ch[i]); while(!q.empty()) { int u = q.front(); q.pop(); for(int i=1;i<=26;i++) { int &v = tr[u].ch[i]; if(!v) { v = tr[tr[u].f].ch[i]; continue; } tr[v].f = tr[tr[u].f].ch[i]; q.push(v); } }}int main(){ scanf("%d",&T); while(T--) { init(); tr[0].vis=1; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",s+1); int len = strlen(s+1); int u = 0; for(int j=1;j<=len;j++) { int c = s[j]-'a'+1; if(!tr[u].ch[c])tr[u].ch[c] = ++tot; u = tr[u].ch[c]; } tr[u].w++; } trie_pic(); scanf("%s",st+1); int u = 0,now,ans = 0,len = strlen(st+1); for(int i=1;i<=len;i++) { int c = st[i]-'a'+1; u = tr[u].ch[c]; now = u; while(!tr[now].vis) { ans+=tr[now].w; tr[now].w=0; tr[now].vis=1; now=tr[now].f; } } printf("%d\n",ans); } return 0;}

 

转载于:https://www.cnblogs.com/LiGuanlin1124/p/9668290.html

你可能感兴趣的文章
使用MVVM框架时,如何处理在页面动态渲染完之后需要发生的事件呢?
查看>>
StringBuilder与StringBuffer的区别
查看>>
String、StringBuffer、StringBuilder
查看>>
(转)导出EXCEL时科学计数法问题
查看>>
SVN客户端与服务器端搭建
查看>>
知识点整理一
查看>>
判断浏览器
查看>>
追加window.onload事件
查看>>
python并发编程之进程池,线程池concurrent.futures
查看>>
rdd的元素打印
查看>>
hdu4812 点分治水题
查看>>
最长回文子串(Manacher算法)
查看>>
第一次博客
查看>>
写给自己
查看>>
部署全局ajax处理
查看>>
Codeforces Round #403(div 2)
查看>>
大型网站处理高并发要点技术
查看>>
Codeforces-1059D:Nature Reserve问最大的圆包含全部点
查看>>
牛客练习赛24
查看>>
转发推荐系统文章
查看>>