首页 > 其他 > 详细

AC自动机

时间:2019-03-13 22:45:40      阅读:178      评论:0      收藏:0      [点我收藏+]

技术分享图片

#include<bits/stdc++.h>
using namespace std;
string mob[300010<<1];
int num[300010<<1];
int ch[300010<<1][26+1];
int fail[300010<<1];
int ans[300010<<1];
int temp;
int n,siz;
void insert(string s,int v){
    int now=0;
    for(int i=0;i<s.size();i++){
        int o=s[i]-a;
        if(!ch[now][o])ch[now][o]=++siz;
        now=ch[now][o];
    }
    num[now]=v;
}
void getfail(){
    int now=0;
    queue<int>que;
    for(int i=0;i<26;i++)if(ch[0][i])que.push(ch[0][i]),fail[ch[0][i]]=0;
    while(!que.empty()){
        int u=que.front();que.pop();
        for(int i=0;i<26;i++){
            int v=ch[u][i];
            if(v)fail[v]=ch[fail[u]][i],que.push(v);
            else ch[u][i]=ch[fail[u]][i];
        }
    }
}
void query(string s){
    int now=0;
    for(int i=0;i<s.size();i++){
        now=ch[now][s[i]-a];
        for(int j=now;j;j=fail[j])ans[num[j]]++;
    }
}
int main(){
    while(cin>>n and n){
        memset(num,0,sizeof(num));
        memset(ans,0,sizeof(ans));
        memset(ch,0,sizeof(ch));
        memset(fail,0,sizeof(fail));
        siz=0;
        for(int i=1;i<=n;i++){
            cin>>mob[i];
            insert(mob[i],i);
        }
        getfail();
        string k;
        cin>>k;
        query(k);
        temp=0;
        for(int i=1;i<=n;i++)if(ans[i]>temp)temp=ans[i];
        cout<<temp<<"\n";
        for(int i=1;i<=n;i++)if(ans[i]==temp)cout<<mob[i]<<"\n";
    }
    return 0;
}

 

AC自动机

原文:https://www.cnblogs.com/qf-breeze/p/10526924.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!