标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 582 Accepted Submission(s): 323
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+200;
char Text[maxn][maxn/10],Pattern[maxn];
struct ACnode{
ACnode *fail;
ACnode *next[26];
int cnt;
ACnode (){
fail=NULL;
for(int i=0;i<26;i++)
next[i]=NULL;
}
}*Q[maxn*10];
ACnode *newacnode(){
ACnode *tmp;
tmp=new ACnode;
tmp->cnt=0;
}
void Insert(ACnode *rt,char *s){
int len=strlen(s);
int idx;
for(int i=0;i<len;i++){
idx=s[i]-‘a‘;
if(rt->next[idx]==NULL){
rt->next[idx]=newacnode();
}
rt=rt->next[idx];
}
rt->cnt++;
}
void BuildAC(ACnode *root){
int head,tail;
head=tail=0;
for(int i=0;i<26;i++){
if(root->next[i]!=NULL){
root->next[i]->fail=root;
Q[tail++]=root->next[i];
}
}
ACnode *p,*tmp;
while(head!=tail){
p=Q[head++];
tmp=NULL;
for(int i=0;i<26;i++){
if(p->next[i]!=NULL){
tmp=p->fail;
while(tmp!=NULL){
if(tmp->next[i]!=NULL){
p->next[i]->fail=tmp->next[i];
break;
}
tmp=tmp->fail;
}
if(tmp==NULL){
p->next[i]->fail=root;
}
Q[tail++]=p->next[i];
}
}
}
}
int Query(ACnode *root,char *str){
ACnode *p=root,*tmp=NULL;
int idx,len,ret;
ret=0;
len=strlen(str);
for(int i=0;i<len;i++){
idx=str[i]-‘a‘;
while( p->next[idx]==NULL && p!=root )
p=p->fail;
p=p->next[idx];
if(p == NULL)
p=root;
tmp=p;
while(tmp!=root ){
ret+=tmp->cnt;
tmp=tmp->fail;
}
}
return ret;
}
int main(){
int n,m,t;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
ACnode *root;
root=newacnode();
for(int i=0;i<n;i++){
scanf("%s",Text[i]);
}
for(int i=0;i<m;i++){
scanf("%s",Pattern);
Insert(root,Pattern);
}
BuildAC(root);
for(int i=0;i<n;i++){
int ans=Query(root,Text[i]);
printf("%d\n",ans);
}
}
return 0;
}
HDU 5384——Danganronpa——————【AC自动机】
标签:
原文地址:http://www.cnblogs.com/chengsheng/p/4735271.html