zoukankan      html  css  js  c++  java
  • bzoj3172 Ac自动机

    根据fail树的性质 我们在建树的时候每建一个串就将他路径上的点全部加1表示这个串的后缀又出现了一次 然后从下到上把sum加起来就可以得到答案了
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int size=26,M=1000005;
    char c[M];
    int w[255],n;
    struct node{
        int sum,fail[M],a[M][27],ans[M];
        int id(char s){return s-'a'+1;}
        void insert(char s[],int &x){
            int k=0,L=strlen(s);
            for(int i=0;i<L;i++){
                int now=id(s[i]);
                if(!a[k][now]) a[k][now]=++sum;
                ans[a[k][now]]++; 
                k=a[k][now];
            }
            x=k;
        }
        int q[M],head,tail;
        void Ac_boy(){
            for(int i=1;i<=size;i++){
                int now=a[0][i];
                if(now) q[tail++]=now;
            }
            while(head!=tail){
                int x=q[head++];
                for(int i=1;i<=size;i++){
                    int now=a[x][i];
                    if(!now){a[x][i]=a[fail[x]][i];continue;}
                    q[tail++]=now;
                    fail[now]=a[fail[x]][i];
                }
            }
        }
        void work(){
            for(int i=tail-1;i>=0;i--) ans[fail[q[i]]]+=ans[q[i]];
            for(int i=1;i<=n;i++) printf("%d
    ",ans[w[i]]);
        }
    }node;
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%s",c),node.insert(c,w[i]);
        node.Ac_boy(); node.work();
        return 0;
    }
    View Code
  • 相关阅读:
    Spring MVC 复习笔记03
    Spring MVC 复习笔记02
    CSS之选择器
    Filedset
    Label标签
    Table标签
    列表标签
    CSS之img标签
    CSS之a标签锚点
    CSS之checkbox&radio&textarea&select
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/6895371.html
Copyright © 2011-2022 走看看