zoukankan      html  css  js  c++  java
  • HDU 2222

    终于来到AC自动机训练,关于AC自动机可以专门开一个post来详述,之后补上

    模板题,彻底弄清kuangbin大神的模板后,自己复现了下才发现还是需要很多训练巩固这么精妙的算法

    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <string>
    #include <vector>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <stack>
    #include <map>
    #include <set>
    using namespace std;
    
    const int maxl= 55;
    const int maxc= 5e5+5;
    const int maxt= 1e6+5;
    
    struct Trie
    {
    	int root, L;
    	int next[maxc][26], fail[maxc], end[maxc];
    	int NewNode()
    	{
    		for (int i= 0; i< 26; ++i){
    			next[L][i]= -1;
    		}
    		end[L++]= 0;
    		return L-1;
    	}
    	void init()
    	{
    		L= 0;
    		root= NewNode();
    	}
    	void insert(char str[])
    	{
    		int lth= strlen(str);
    		int now= root;
    		for (int i= 0; i< lth; ++i){
    			int idx= str[i]-'a';
    			if (-1== next[now][idx]){
    				next[now][idx]= NewNode();
    			}
    			now= next[now][idx];
    		}
    		++end[now];
    	}
    	void build()
    	{
    		queue<int> Q;
    		int now;
    		fail[root]= root;
    		for (int i= 0; i< 26; ++i){
    			if (-1== next[root][i]){
    				next[root][i]= root;
    			}
    			else{
    				fail[next[root][i]]= root;
    				Q.push(next[root][i]);
    			}
    		}
    
    		while (!Q.empty()){
    			now= Q.front();
    			Q.pop();
    
    			for (int i= 0; i< 26; ++i){
    				if (-1== next[now][i]){
    					next[now][i]= next[fail[now]][i];
    				}
    				else{
    					fail[next[now][i]]= next[fail[now]][i];
    					Q.push(next[now][i]);
    				}
    			}
    		}
    	}
    	int query(char str[])
    	{
    		int ans= 0, now= root;
    		int lth= strlen(str);
    
    		for (int i= 0; i< lth; ++i){
    			now= next[now][str[i]-'a'];
    			int temp= now;
    
    			while (root!= temp){
    				ans+= end[temp];
    				end[temp]= 0;
    				temp= fail[temp];
    			}
    		}
    
    		return ans;
    	}
    };
    char str[maxl], str_t[maxt];
    Trie ac;
    
    int main(int argc, char const *argv[])
    {
    	int kase= 0;
    	scanf("%d", &kase);
    
    	while (kase--){
    		int n;
    		ac.init();
    		scanf("%d", &n);
    		for (int i= 0; i< n; ++i){
    			scanf(" %s", str);
    			ac.insert(str);
    		}
    		ac.build();
    		scanf(" %s", str_t);
    		printf("%d
    ", ac.query(str_t));
    	}
    	return 0;
    }
    
  • 相关阅读:
    JavaScript model案例
    JavaScript 正反选示例
    JavaScript onchange
    JavaScript mouse事件
    JavaScript history属性
    JavaScript event事件
    JavaScript class css样式 DOM Tree
    JavaScript 增加和删除标签
    自动生成代理类
    Microsoft NLayerApp案例理论与实践–DDD、分布式DDD及其分层
  • 原文地址:https://www.cnblogs.com/Idi0t-N3/p/14710643.html
Copyright © 2011-2022 走看看