zoukankan      html  css  js  c++  java
  • HDU 2222 AC自动机模版题

    所学的AC自动机都源于斌哥和昀神的想法。

    题意:求目标串中出现了几个模式串。

    使用一个int型的end数组记录,查询一次。

    #include <cstdio>
    #include <cstring>
    #include <queue>
    
    using namespace std;
    
    const int maxw = 50 * 10000 + 10;
    const int sigma_size = 26;
    const int maxl = 1000000 + 10;
    
    struct Trie{
    	int next[maxw][sigma_size],fail[maxw],end[maxw];
    	int root,L;
    	int newnode(){
    		for(int i=0;i<sigma_size;i++)
    		    next[L][i]=-1;
    		end[L++]=0;
    		return L-1;
    	}
    	void init(){
    		L=0;
    		root=newnode();
    	}
    	void insert(const char *buf){
    		int now=root,len=strlen(buf);
    		for(int i=0;i<len;i++){
    			if(next[now][buf[i]-'a']==-1)
    			    next[now][buf[i]-'a']=newnode();
    			now=next[now][buf[i]-'a'];
    		}
    		end[now]++;
    	}
    	void build()
    	{
    		queue<int>Q;
    		fail[root]=root;
    		for(int i=0;i<sigma_size;i++)
    		    if(next[root][i]==-1)
    		        next[root][i]=root;
    		    else{
    		    	fail[next[root][i]]=root;
    		    	Q.push(next[root][i]);
    		    }
    		while(!Q.empty()){
    			int now=Q.front();
    			Q.pop();
    			for(int i=0;i<sigma_size;i++)
    			    if(next[now][i]==-1)
    			        next[now][i]=next[fail[now]][i];
    			    else{
    			    	fail[next[now][i]]=next[fail[now]][i];
    			        Q.push(next[now][i]);
    			    }
    		}
    	}
    	int query(const char *buf){
    	    int now=root,len=strlen(buf);
    		int res=0;
    		for(int i=0;i<len;i++){
    			now=next[now][buf[i]-'a'];
    			int tmp=now;
    			while(tmp!=root){
    				res+=end[tmp];
    				end[tmp]=0;
    				tmp=fail[tmp];
    			}
    		}
    		return res;
    	}
    };
    
    Trie ac;
    char buf[maxl];
    
    int main()
    {
    	int T,n;
    	scanf("%d",&T);
    	while(T--)
    	{
    		scanf("%d",&n);
    		ac.init();
    		for(int i=0;i<n;i++)
    		{
    			scanf("%s",buf);
    			ac.insert(buf);
    		}
    		ac.build();
    		scanf("%s",buf);
    		int ans=ac.query(buf);
    		printf("%d
    ",ans);
    	}
    	return 0;
    }


     

  • 相关阅读:
    vault学习笔记
    rabbit搭建
    安装windows虚拟机
    Java Unknown named curve: 1.3.132.0.10
    文件操作,读文件或者写文件
    Java 中带参无返回值方法的使用
    Java 中无参无返回值方法的使用
    mac系统如何显示和隐藏文件
    解决JSP页面显示乱码
    Java 中无参带返回值方法的使用
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3398178.html
Copyright © 2011-2022 走看看