zoukankan      html  css  js  c++  java
  • AC自动机模板

    #include <bits/stdc++.h>
    #define ll long long
    #define eps 1e-7
    using namespace std;
    inline int read(){
        int x=0;int f=1;char ch=getchar();
        while(ch>'9'||ch<'0') {if(ch=='-') f=-1;ch=getchar();}
        while(ch<='9'&&ch>='0') {x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    const int MAXN=1e+10;
    struct node {
        int endflag;
        int value;
        int linkk[26];
        int fail;
    }tree[500010];
    int root=0;
    int slen;
    char str[1000100];
    int q[1000010];
    int len,n;
    void buildtrie(int x,int node){
        int s=str[x]-'a';
        if(!tree[node].linkk[s]){
            tree[node].linkk[s]=++len;
            tree[len].endflag=0;
            tree[len].fail=root;
        }
        int nextnode=tree[node].linkk[s];
        if(x==slen-1){
            tree[nextnode].endflag++;
            return ;
        }
        buildtrie(x+1,nextnode);
    }
    void init(){
        cin>>n;
        memset(tree,0,sizeof(tree));
        for(int i=1;i<=n;i++){
            scanf("%s",str);
            slen=strlen(str);
            buildtrie(0,root);
        }
    }
    void buildac(){
       int head=0;
       int tail=0;
       q[++tail]=root;
       while(head<tail){
            int now=q[++head];
            for(int i=0;i<26;i++){
                if(tree[now].linkk[i]){
    	            int nextnode=tree[now].linkk[i];
    	            if(now!=root){
                        int temp=tree[now].fail;
    	                while(temp!=root&&!tree[temp].linkk[i]){
    	                    temp=tree[temp].fail;
    	                }
    	                tree[nextnode].fail=tree[temp].linkk[i];
    	            }
    	            q[++tail]=nextnode;
    	        }
            }
        }
    }
    void find(){
        int ans=0;
        scanf("%s",str);
        int len=strlen(str);
        int now=root;
        for(int i=0;i<len;i++){
            int chindex=str[i]-'a';
            while(!tree[now].linkk[chindex]&&now!=root){
                now=tree[now].fail;
            }
            now=tree[now].linkk[chindex];
            int temp=now;
            while(temp!=root&&tree[temp].endflag>-1){
                ans+=tree[temp].endflag;
                tree[temp].endflag=-1;
                temp=tree[temp].fail;
            }
        }
        cout<<ans<<endl;
    }
    int main(){
        init();
        buildac();
        find();
        return 0;
    }
    

      

  • 相关阅读:
    Unity3d限制帧数
    Linux 后台运行程序
    Flask异步发送邮件的方法
    [转]视图多表
    dede 织梦手机静态化一键生成插件
    如何在wordpress中设置关键词和描述
    前端PS切图
    帝国cms用自定义列表页做首页
    帝国cms 滚动加载更多整合
    swiper 自定义pagination 样式内容
  • 原文地址:https://www.cnblogs.com/something-for-nothing/p/8861375.html
Copyright © 2011-2022 走看看