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

    AC自动机

    #include<iostream>
    #include<cstdio>
    #include<memory.h>
    #include<queue>
    #include<cstring>
    using namespace std;
    #define ri register int
    #define rep(i,a,b) for(ri i=(a);i<=(b);i++)
    #define N 1000100
    #define A 26
    int n;
    char S[151][71];
    char T[N];
    struct AC{
    	int cnt;
    	int ch[N][A],fail[N],val[N],ans[N];
    	inline void clear(){
    		cnt=0;
    		memset(ch,0,sizeof(ch));
    		memset(fail,0,sizeof(fail));
    		memset(val,0,sizeof(val));
    		memset(ans,0,sizeof(ans));
    	}
    	inline void insert(char* s,int x){
    		ri u=0,l=strlen(s);
    		rep(i,0,l-1){
    			ri v=s[i]-'a';
    			if(!ch[u][v])
    				ch[u][v]=++cnt;
    			u=ch[u][v];
    		}
    		val[u]=x;
    	}
    	inline void getFail(){
    		queue<int> q;
    		rep(i,0,A-1)
    			if(ch[0][i]){
    				fail[ch[0][i]]=0;
    				q.push(ch[0][i]);
    			}
    		for(;!q.empty();){
    			int u=q.front();
    			q.pop();
    			rep(i,0,A-1){
    				if(ch[u][i]){
    					fail[ch[u][i]]=ch[fail[u]][i];
    					q.push(ch[u][i]);
    				}
    				else ch[u][i]=ch[fail[u]][i];
    			}
    		}
    	}
    	inline void query(char* s){
    		ri u=0,l=strlen(s),res=0;
    		rep(i,0,l-1){
    			u=ch[u][s[i]-'a'];
    			for(ri t=u;t;t=fail[t])
    				ans[val[t]]++;
    		}
    		rep(i,1,n)
    			res=max(res,ans[i]);
    		printf("%d
    ",res);
    		rep(i,1,n)
    			if(ans[i]==res)
    				printf("%s
    ",S[i]);
    	}
    } ac;
    int main(){
    	for(;scanf("%d",&n)==1 && n;){
    		ac.clear();
    		rep(i,1,n){
    			scanf("%s",S[i]);
    			ac.insert(S[i],i);
    		}
    		ac.getFail();
    		scanf("%s",T);
    		ac.query(T);
    	}
    	return 0;
    }
    
  • 相关阅读:
    如何让json_decode解码变的更加强壮
    scp命令
    Centos7安装postgresql
    ubuntu安装Java环境
    ubuntu开放端口
    VMware安装Ubuntu
    redis主从安装
    redis主从学习
    redis集群学习
    C++ 09 顺序容器
  • 原文地址:https://www.cnblogs.com/pelom/p/10290489.html
Copyright © 2011-2022 走看看