• 模板——AC自动机


    #include<bits/stdc++.h>
    using namespace std;
    struct nob{
    	int fail,son[27],ed;
    }a[1000000];
    int cnt=0;
    void build (string s){
    	int now=0;
    	for (int i=0; i<s.length(); i++){
    		if (a[now].son[s[i]-'a']==0)
    			a[now].son[s[i]-'a']=++cnt;
    		now=a[now].son[s[i]-'a'];
    	}
    	a[now].ed++;
    }
    void fail(){
    	queueque;
    	for (int i=0; i<26; i++){
    		if (a[0].son[i]!=0){
    			a[a[0].son[i]].fail=0;
    			que.push(a[0].son[i]);
    		}
    	}
    	while (que.size()){
    		int pos=que.front();
    		que.pop();
    		for (int i=0; i<26; i++){
    			if (a[pos].son[i]!=0){
    				a[a[pos].son[i]].fail=a[a[pos].fail].son[i];
    				que.push(a[pos].son[i]);
    			}
    			else a[pos].son[i]=a[a[pos].fail].son[i];
    		}
    	}
    }
    int answer(string s){
    	int now=0,ans=0;
    	for (int i=0; i<s.length(); i++){
    		now=a[now].son[s[i]-'a'];
    		for (int t=now; t&&a[t].ed!=-1; t=a[t].fail){
    			ans+=a[t].ed;
    			a[t].ed=-1;
    		}
    	}
    	return ans;
    }
    int main(){
    	int n;
    	string s;
    	cin>>n;
    	for (int i=1; i<=n; i++){
    		cin>>s;
    		build(s);
    	}
    	a[0].fail=0;
    	fail();
    	cin>>s;
    	cout<<answer(s)<<endl;
    	return 0;
    }
    
  • 相关阅读:
    JavaScript引用类型
    Java08_方法
    网络爬虫(一)
    openCV(四)——鼠标绘制
    openCV(三)——视频
    openCV(二)——基础绘制函数
    openCV(一) 读取保存图像
    JAVA07-数组
    JAVA06-while循环,do while循环
    JAVA05-switch多重选择
  • 原文地址:https://www.cnblogs.com/cain-/p/7611011.html
Copyright © 2020-2023  润新知