您的位置:首页 > 其它

[HDU]2222 Keywords Search

2017-07-28 11:02 441 查看

补全AC自动机版本.

#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std;
queue<int> q;
const int maxn=500005;
const int N=10005;
char str[maxn*2],T,n;
int tot;
struct node{int c[26],fail,cnt;}s[maxn];
inline void insert(char *ss){
int p=0;
for(int i=0;ss[i];i++){
int index=ss[i]-'a';
if(!s[p].c[index]) s[p].c[index]=++tot;
p=s[p].c[index];
}
s[p].cnt++;
}
void bfs(){
s[0].fail=0;
for(int i=0;i<26;i++){
int u=s[0].c[i];
if(u) {s[u].fail=0;q.push(u);}
}
while(!q.empty()){
int u=q.front();q.pop();
for(int i=0;i<26;i++){
int v=s[u].c[i];
if(!v) {s[u].c[i]=s[s[u].fail].c[i];continue;}
s[v].fail=s[s[u].fail].c[i];
q.push(v);
}
}
}
int ac(char *ss){
int i,j,u,v,sum;
u=sum=0;
for(i=0;ss[i];i++){
int index=ss[i]-'a';
v=u=s[u].c[index];
while(s[v].cnt){
sum+=s[v].cnt;
s[v].cnt=0;
v=s[v].fail;
}
}
return sum;
}
int main(){
int n,i,j,t;
char ss[maxn<<1];
scanf("%d",&T);
while(T--){
scanf("%d",&n);
memset(s,0,sizeof(s));
for(i=1;i<=n;i++){
scanf("%s",ss);
insert(ss);
}
bfs();
scanf("%s",ss);
printf("%d\n",ac(ss));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: