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

    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int N=26;
    const int MAXN=500005;
    struct Trie{
        int next[MAXN][N],fail[MAXN],end[MAXN];
        int root;
        int tot;
        int newnode()
        {
            for(int i=0;i<N;i++) next[tot][i]=-1;
            end[tot++]=0;
            return tot-1;
        }
        void init()
        {
    		tot=0;
    		root=newnode();
    	}
    	void insert(char s[])
    	{
    		int len=strlen(s);
    		int now=root;
    		for(int i=0;i<len;i++)
    		{
    			int k=s[i]-'a';
    			if(next[now][k]==-1) next[now][k]=newnode();
    			now=next[now][k];
    		}
    		end[now]++;
    	}
    	void build()
    	{
    		queue<int> que;
    		fail[root]=root;
    		for(int i=0;i<N;i++)
    		    if(next[root][i]==-1) next[root][i]=root;
    		    else
    		    {
    				fail[next[root][i]]=root;
    				que.push(next[root][i]);
    			}
    		while(!que.empty())
    		{
    			int now=que.front();
    			que.pop();
    			for(int i=0;i<N;i++)
    			    if(next[now][i]==-1) next[now][i]=next[fail[now]][i];
    			    else
    			    {
    					fail[next[now][i]]=next[fail[now]][i];
    					que.push(next[now][i]);
    				}
    		}
    	}
    	int query(char s[])
    	{
    		int len=strlen(s);
    		int now=root;
    		int res=0;
    		for(int i=0;i<len;i++)
    		{
    			now=next[now][s[i]-'a'];
    			int temp=now;
    			while(temp!=root&&end[temp]!=-1)
    			{
    				res+=end[temp];
    				end[temp]=-1;
    				temp=fail[temp];
    			}
    		}
    		return res;
    	}
    };
    Trie ac;
    char s[MAXN<<1];
    int main()
    {
    	int T;
    	scanf("%d",&T);
    	while(T--)
    	{
    		int n;
    		scanf("%d",&n);
    		ac.init();
    		while(n--)
    		{
    			scanf("%s",s);
    			ac.insert(s);
    		}
    		ac.build();
    		scanf("%s",s);
    		printf("%d
    ",ac.query(s));
    	}
    	return 0;
    }
    
  • 相关阅读:
    indy tcpclient tcpServer
    Delphi生成即调用带窗体的Dll
    本地同步到网络时间
    tfield的字段名和显示名
    Delphi流的操作_文件合并
    Delphi7 流操作_压缩
    delphi内嵌汇编
    给rar文件加个自定义头
    fastreport小入门
    delphi 单例模式
  • 原文地址:https://www.cnblogs.com/lxyzxzy/p/12817373.html
Copyright © 2011-2022 走看看