Login / Get an account Logout
  • view
  • edit
  • history
  • discuss

template/coldwater/ac_dfa

  • trie 图

trie 图

struct AC_DFA{
	int go[MAXNODE][DICSIZE], fail[MAXNODE];
	int sz, root;
	
	int newnode(){
		int ret = ++ sz;
		memset(go[ret], 0, sizeof(go[ret]));
		fail[ret] = root;
		//f[ret] = 0;
		return ret;
	}
	
	void init(){
		root = 0;
		sz = 0;
		root = newnode();
	}
	
	void insert(char *str, int v){
		int n = strlen(str);
		int p = root;
		for(int i = 0; i < n; ++ i){
			int c = str[i] - 'a';
			if(!go[p][c]){
				go[p][c] = newnode();
			}
			p = go[p][c];
		}
		//f[p] |= 1 << v;
	}
	
	void makefail(){
		std::queue<int> queue;
		queue.push(root);
		while(!queue.empty()){
			int p = queue.front(); queue.pop();
			for(int i = 0; i < DICSIZE; ++ i){
				if(go[p][i]){
					fail[go[p][i]] = fail[p] ? go[fail[p]][i] : root;
					int q = go[p][i];
					//f[q] |= f[fail[q]];
					queue.push(q);
				}
				else{
					go[p][i] = p == root ? root : go[fail[p]][i];
				}
			}
		}
	}
};
京ICP备17037022号
Site
  • Front page
  • All pages
  • Categories
  • Random page
  • Recent activity
  • Upload a file
  • Help
This page
  • Raw page source
  • Printable version
  • Delete this page