ac自动机

来源:互联网 发布:人类清除计划知乎 编辑:程序博客网 时间:2024/06/01 13:42
#define NN 120#define MM 32struct node{int fal,sign;//sign根据需要修改的int next[N];};char s[205],ss[10010];node a[1000100];vector<int>ans[1001];int n,m,tot;void init(){a[0].fal=0; a[0].sign=-1;tot=0;memset(a[0].next,-1,sizeof(a[0].next));}void tree(int st){int len=strlen(s);int u=0;rep(i,len){int x=s[i]-MM;if(a[u].next[x]==-1){++tot;a[tot].fal=0; a[tot].sign=-1;memset(a[tot].next,-1,sizeof(a[tot].next));a[u].next[x]=tot;}u=a[u].next[x];if(i==len-1)a[u].sign=st;}}int fail(int u,int k){if(a[u].next[k]!=-1) return a[u].next[k];if(u==0) return 0;return fail(a[u].fal,k);}void bulid(){queue<int>q;q.push(0);while(!q.empty()){int u=q.front(); q.pop();rep(i,NN)if(a[u].next[i]!=-1){q.push(a[u].next[i]);if(u==0) a[a[u].next[i]].fal=0;else a[a[u].next[i]].fal=fail(a[u].fal,i);}}}void find(int sign){int len=strlen(ss);int u=0;rep(i,len){int x=ss[i]-MM;while(a[u].next[x]==-1 && u!=0) u=a[u].fal;if(a[u].next[x]==-1) u=0;else u=a[u].next[x];int rr=u;while(rr!=0)//根据匹配对情况就行修改,可以根据题意的!{if(a[rr].sign!=-1)ans[sign].pb(a[rr].sign);rr=a[rr].fal;}}}void work(){    init();repf(i,1,n){scanf("%s",s);tree(i);}bulid(); repf(i,1,m){scanf("%s",ss);find(i);//查找的。可以根据自己的需要进行修改} }int main(){    while(~scanf("%d",&n)){work();}    return 0;}


原创粉丝点击