AC自动机模板

来源:互联网 发布:海贼王 知乎 编辑:程序博客网 时间:2024/06/14 16:50
#include<stdio.h>#include<algorithm>#include<string.h>#include<iostream>#include<queue>using namespace std;const int maxm=130;int ans[1111][5];char str[1111111];int id,vis[1111],a[1111];struct node{int count; struct node *next[130]; struct node *fail; void init() { int i; for(i=0;i<maxm;i++)  next[i]=NULL; count=0; fail=NULL;}}*root;void insert();void getfail();void query();void deal(node *t);int main(){int n,i,j,k,m;while(scanf("%d",&n)!=EOF){root = new node;root -> fail=NULL;root -> init();for(i=1;i<=n;i++){scanf("%s",str);id=i;insert();}getfail();scanf("%d",&m);memset(ans,0,sizeof(ans));for(i=1;i<=m;i++){memset(vis,0,sizeof(vis));id=i;scanf("%s",str);query();}int cnt=0;for(i=1;i<=m;i++){if(ans[i][0]>=1){cnt++;printf("web %d:",i);int a[1111];memset(a,0,sizeof(a));for(j=0;ans[i][j]>=1;j++)a[ans[i][j]]=1;int k;for(k=1;k<1100;k++){if(a[k])printf(" %d",k);}printf("\n");}}printf("total: %d\n",cnt);deal(root);}return 0;}void insert(){int len,k,i,ip;node *p=root;len=strlen(str);for(i=0;i<len;i++){ip=str[i]-31;if(p->next[ip]==NULL){p->next[ip]=new node;p->next[ip]->init();p=p->next[ip];}elsep=p->next[ip];}p->count=id;}void getfail(){int i,j,k;node *p,*temp,*son;queue<struct node *>q;q.push(root);p=root;while(!q.empty()){temp=q.front();q.pop();for(i=0;i<maxm;i++){son=temp->next[i];if(son!=NULL){if(temp==root)son->fail=root;else{p=temp->fail;while(p){if(p->next[i]!=NULL){son->fail=p->next[i];break;}p=p->fail;}if(p==NULL)son->fail=root;}q.push(son);}}}}void query(){int len,i,cnt=0,ip;len=strlen(str);node *p,*temp;p=root;for(i=0;i<len;i++){ip=str[i]-31;while(!p->next[ip] && p!=root)p=p->fail;p=p->next[ip];temp=p;while(temp!=root){if(temp->count>=1 && !vis[temp->count]){ans[id][cnt++]=temp->count;vis[temp->count]=1;}temp=temp->fail;}}}void deal(node *t){if(t==NULL)return;for(int i=0;i<maxm;i++){if(t->next[i]!=NULL)deal(t->next[i]);}free(t);}

0 0
原创粉丝点击