标签:
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