博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[hdu2222] [AC自动机模板] Keywords Search [AC自动机]
阅读量:4340 次
发布时间:2019-06-07

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

AC自动机模板,注意!ch,Fail,lab数组的大小不是n而是节点个数,需要认真计算!

1 #include 
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 10 using namespace std;11 12 int cnt;13 int ch[1100000][26],Fail[1100000],lab[1100000];14 char str[1100000],S[1100000];15 16 void Add(const char * s)17 {18 int p=0,i;19 for(i=1;s[i];++i)20 {21 if(!ch[p][s[i]-97])ch[p][s[i]-97]=++cnt;22 p=ch[p][s[i]-97];23 }24 lab[p]++;25 return ;26 }27 28 void Build()29 {30 int i,t;31 queue
Q;32 Q.push(0);33 while(!Q.empty())34 {35 t=Q.front();Q.pop();36 for(i=0;i<26;++i)37 {38 if(ch[t][i])39 {40 Q.push(ch[t][i]);41 Fail[ch[t][i]]=t?ch[Fail[t]][i]:0;42 }43 else ch[t][i]=ch[Fail[t]][i];44 }45 }46 return ;47 }48 49 int main()50 {51 int T,n,i;52 53 scanf("%d",&T);54 while(T--)55 {56 memset(Fail,0,sizeof(Fail));57 memset(ch,0,sizeof(ch));58 memset(lab,0,sizeof(lab));59 cnt=0;60 scanf("%d",&n);61 for(i=1;i<=n;++i)62 {63 scanf("%s",str+1);64 Add(str);65 }66 Build();67 scanf("%s",S+1);68 int p=0,Ans=0;69 for(i=1;S[i];++i)70 {71 p=ch[p][S[i]-97];72 if(lab[p])73 {74 int pp=p;75 while(pp)Ans+=lab[pp],lab[pp]=0,pp=Fail[pp];76 }77 }78 printf("%d\n",Ans);79 }80 81 return 0;82 }
View Code

 

转载于:https://www.cnblogs.com/Gster/p/4978919.html

你可能感兴趣的文章
《BI那点儿事》数据流转换——百分比抽样、行抽样
查看>>
哈希(1) hash的基本知识回顾
查看>>
Leetcode 6——ZigZag Conversion
查看>>
dockerfile_nginx+PHP+mongo数据库_完美搭建
查看>>
Http协议的学习
查看>>
【转】轻松记住大端小端的含义(附对大端和小端的解释)
查看>>
设计模式那点事读书笔记(3)----建造者模式
查看>>
ActiveMQ学习笔记(1)----初识ActiveMQ
查看>>
Java与算法之(2) - 快速排序
查看>>
Windows之IOCP
查看>>
WebSocket & websockets
查看>>
openssl 升级
查看>>
ASP.NET MVC:通过 FileResult 向 浏览器 发送文件
查看>>
CVE-2010-2883Adobe Reader和Acrobat CoolType.dll栈缓冲区溢出漏洞分析
查看>>
使用正确的姿势跨域
查看>>
AccountManager教程
查看>>
Android学习笔记(十一)——从意图返回结果
查看>>
算法导论笔记(四)算法分析常用符号
查看>>
ultraedit激活
查看>>
总结(6)--- python基础知识点小结(细全)
查看>>