[hdu2222] [AC自动机模板] Keywords Search [AC自动机]
2024-09-02 17:00:38
AC自动机模板,注意!ch,Fail,lab数组的大小不是n而是节点个数,需要认真计算!
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <queue> using namespace std; int cnt;
int ch[][],Fail[],lab[];
char str[],S[]; void Add(const char * s)
{
int p=,i;
for(i=;s[i];++i)
{
if(!ch[p][s[i]-])ch[p][s[i]-]=++cnt;
p=ch[p][s[i]-];
}
lab[p]++;
return ;
} void Build()
{
int i,t;
queue<int> Q;
Q.push();
while(!Q.empty())
{
t=Q.front();Q.pop();
for(i=;i<;++i)
{
if(ch[t][i])
{
Q.push(ch[t][i]);
Fail[ch[t][i]]=t?ch[Fail[t]][i]:;
}
else ch[t][i]=ch[Fail[t]][i];
}
}
return ;
} int main()
{
int T,n,i; scanf("%d",&T);
while(T--)
{
memset(Fail,,sizeof(Fail));
memset(ch,,sizeof(ch));
memset(lab,,sizeof(lab));
cnt=;
scanf("%d",&n);
for(i=;i<=n;++i)
{
scanf("%s",str+);
Add(str);
}
Build();
scanf("%s",S+);
int p=,Ans=;
for(i=;S[i];++i)
{
p=ch[p][S[i]-];
if(lab[p])
{
int pp=p;
while(pp)Ans+=lab[pp],lab[pp]=,pp=Fail[pp];
}
}
printf("%d\n",Ans);
} return ;
}
最新文章
- linux-centos在VM中的网络配置
- oracle 多级菜单查询 。start with connect by prior
- [leetcode]Rotate Array
- Android请求返回417解决办法
- cf C. Insertion Sort
- jar包和war包的区别:
- MS数据库优化查询最常见的几种方法
- Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to ;XX.XX.XX.XX:6379] with root cause
- sublime 将tab替换为4个空格 &; 显示空格
- -bash: belts.awk: command not found
- PythonStudy——函数对象的案例
- Nginx下配置网站ssl实现https访问
- linux内核剖析(十一)进程间通信之-共享内存Shared Memory
- Handlebars的基本用法
- webApp开发中的总结
- January 01st, 2018 Week 01st Monday
- SQL Server 之 附加数据库出现“ 拒绝访问 ”
- CSS通过设置position定位的三种常用定位
- 【spring】RestTemplate发送请求,请求第三方接口 的几种请求方式POST,GET,DELETE,PUSH
- Python--Get and Post