• 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;
    }
    
  • 相关阅读:
    「考试」省选62
    「考试」省选61
    「考试」省选59
    「刷题」THUPC泛做
    「考试」省选58
    「考试」省选57
    「考试」省选56
    「考试」省选55
    「考试」省选54
    「考试」省选52
  • 原文地址:https://www.cnblogs.com/lxyzxzy/p/12817373.html
Copyright © 2020-2023  润新知