zoukankan      html  css  js  c++  java
  • P3796 【模板】AC自动机(加强版)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<queue>
    using namespace std;
    
    const int N=1e6+5;
    const int M=2e4;
    
    int n;
    char t[N],p[155][75];
    
    int nxt[M][26];
    int id[M],fail[M],last[M];
    int now_node;
    struct ANS
    {
        int id,cnt;
        bool operator < (const ANS &A) const
        {
            return cnt==A.cnt?id<A.id:cnt>A.cnt;
        }
    }Ans[155];
    
    void insert(char *s,int Id)
    {
        int len=strlen(s);
        int now=0,tmp;
        for(int i=0;i<len;++i)
        {
            tmp=s[i]-'a';
            if(nxt[now][tmp]==0)
                nxt[now][tmp]=++now_node;
            now=nxt[now][tmp];
        }
        id[now]=Id;
        return;
    }
    
    queue<int> que;
    void getfail()
    {
        for(int i=0;i<26;++i)
        {
            if(nxt[0][i])
            {
                que.push(nxt[0][i]);
            }
        }
        int now,tmp;
        while(!que.empty())
        {
            now=que.front(),que.pop();
            for(int i=0;i<26;++i)
            {
                tmp=nxt[now][i];
                if(tmp)
                {
                    fail[tmp]=nxt[fail[now]][i];
                    last[tmp]=id[fail[tmp]]?fail[tmp]:last[fail[tmp]];
                    que.push(tmp);
                }
                else
                    nxt[now][i]=nxt[fail[now]][i];
            }
        }
    }
    
    void query(char *s)
    {
        int len=strlen(s);
        int now=0;
        for(int i=0;i<len;++i)
        {
            now=nxt[now][s[i]-'a'];
            for(int j=now;j;j=last[j])
                ++Ans[id[j]].cnt;
        }
    }
    
    int main()
    {
        while(scanf("%d",&n)&&n!=0)
        {
            memset(nxt,0,sizeof(nxt));
            for(int i=0;i<=now_node;++i)
                fail[i]=0,last[i]=0,id[i]=0;
            now_node=0;
            for(int i=1;i<=n;++i)
            {
                scanf("%s",p[i]);
                insert(p[i],i);
                Ans[i].id=i,Ans[i].cnt=0;
            }
            Ans[0].cnt=0;
            getfail();
            scanf("%s",t);
            query(t);
            sort(Ans+1,Ans+n+1);
            cout<<Ans[1].cnt<<'
    ';
            for(int i=1;i<=n;++i)
            {
                puts(p[Ans[i].id]);
                if(Ans[i].cnt!=Ans[i+1].cnt)
                    break;
            }
        }
        return 0;
    }
  • 相关阅读:
    CC2540-BLE4.0 学历笔记1之串口体验
    cc2530的PWM实现
    用qt写的一个简单到不能在简单的上位机
    在Kubuntu14.04中安装小企鹅输入法
    初始化umi项目
    工具杂记(三) -- zookeeper
    工具杂记(二) -- Centos7
    工具杂记(一) -- vagrant
    (一)Docker导学
    JVM随笔(二)之搜索类
  • 原文地址:https://www.cnblogs.com/lovewhy/p/9633565.html
Copyright © 2011-2022 走看看