您的位置:首页 > 其它

AC自动机模板

2016-02-07 01:24 363 查看
第一次写得不好,大神们误喷...

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define For(i,j,k) for (i=j;i<=k;i++)
using namespace std;

const int dmax=1010;

struct node{
int count,flag;
struct node *next[26],*fa,*fail;
char s1[110];
node(){
fail=fa=NULL;
count=flag=0;
memset(next,0,sizeof(next));
memset(s1,0,sizeof(s1));
}
};
struct node *root,*h,*fa,*tmp,*temp;
struct node *q[dmax*dmax];
char p[dmax][dmax];
char s[dmax*dmax];

void insert(char *w){
int i,k,n=strlen(w);
h=root;
For(i,0,n-1){
k=w[i]-97;
if (h->next[k]==NULL){
tmp=new node;
tmp->fa=h;
h->next[k]=tmp;
}
h=h->next[k];
}
h->count=1;
strcpy(h->s1,w);
}
void create_fail(){
int i,j,k,m,n,f=0,l=1;
q[1]=root;
while (f<l){
fa=q[++f];
For(i,0,25)
if (fa->next[i]!=NULL){
tmp=fa->fail;
while (tmp!=NULL && tmp->next[i]==NULL) tmp=tmp->fail;
fa->next[i]->fail=tmp==NULL?root:tmp->next[i];
q[++l]=fa->next[i];
}
}

}
void auto_search(char *s){
int i,j,k,m,n=strlen(s);
h=root;
For(i,0,n-1){
k=s[i]-97;
while (h!=NULL && h->next[k]==NULL) h=h->fail;
h=h==NULL?root:h->next[k];
if (h!=root){
tmp=h;
while (tmp!=NULL){
if (tmp->count && !tmp->flag){
printf("%s %d\n",tmp->s1,i-strlen(tmp->s1)+1);
tmp->flag=1;
}
tmp=tmp->fail;
}
}
}
}

int main(){
int i,j,k,m,n=0;
root=new node;
root->fail=NULL;
while (1){
gets(p[++n]);
if (p
[0]=='\0'){
n--;
break;
}
insert(p
);
}
gets(s);
create_fail();
auto_search(s);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: