• $AC自动机$


    #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<<"
    ";
            for(int i=1;i<=n;i++)if(ans[i]==temp)cout<<mob[i]<<"
    ";
        }
        return 0;
    }
    不存在十全十美的文章 如同不存在彻头彻尾的绝望
  • 相关阅读:
    自己总结的Java归并排序代码
    SpringDataJpa
    多态
    向上转型向下转型
    python面向对象装饰器
    Apache
    git
    μWSGI
    虚拟环境
    软件仓库(持续更新中)
  • 原文地址:https://www.cnblogs.com/qf-breeze/p/10526924.html
Copyright © 2020-2023  润新知