首页 > 代码库 > HDU 3065
HDU 3065
AC自动机模板题
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string.h> 5 #include <string> 6 #include <queue> 7 using namespace std; 8 const int N=1002; 9 char str[2000005],s1[N][52];10 int ch[50010][26];11 int val[50010],sz,n,root,fail[50010],count1[N];12 int newnode(){13 memset(ch[sz],-1,sizeof(ch[sz]));14 val[sz]=-1;15 return sz++;16 }17 void init(){18 sz=0;19 root=newnode();20 }21 void insert(char* st,int id){22 int len=strlen(st);23 int now=root;24 for(int i=0;i<len;i++){25 int &u=ch[now][st[i]-‘A‘];26 if(u==-1)u=newnode();27 now=u;28 }29 val[now]=id;30 count1[id]=0;31 }32 void getfail(){33 queue<int> q;34 fail[root] = root;35 for(int i=0;i<26;i++){36 int &u=ch[root][i];37 if(u!=-1){38 fail[u]= 0;39 q.push(u);40 }41 else u=root;42 }43 while(!q.empty()){44 int now=q.front();45 q.pop();46 for(int i=0;i<26;i++){47 int u=ch[now][i];48 if(u==-1)ch[now][i]=ch[fail[now]][i];49 else {50 fail[u]=ch[fail[now]][i];51 q.push(u);52 }53 }54 }55 }56 void query(char *s){57 int len=strlen(s);58 int now=root;59 for(int i=0;i<len;i++){60 if(s[i]>‘Z‘||s[i]<‘A‘)now=root;61 else {62 now=ch[now][s[i]-‘A‘];63 int tem=now;64 while(tem!=root){65 if(val[tem]!=-1)count1[val[tem]]++;66 tem=fail[tem];67 }68 }69 }70 }71 int main(){72 int i;73 while(scanf("%d",&n)!=EOF){74 init();75 for(i=1;i<=n;i++){76 scanf("%s",s1[i]);77 insert(s1[i],i);78 }79 scanf("%s",str);80 getfail();81 query(str);82 for(i=1;i<=n;i++){83 if(count1[i])84 printf("%s: %d\n",s1[i],count1[i]);85 }86 }87 return 0;88 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。