AC自动机模板

本文分享了一个简洁的AC自动机实现模板,包括Trie树的建立、插入字符串及获取失败指针等关键步骤,方便日后查阅使用。

看了别人写的AC自动机,瞬时觉得自己写的好难看,于是决定改写一下,贴一下模板,以后备用

#define maxn 220000
#define ll long long

int n, m;

struct Trie{
	Trie *fail, *go[26];
	bool ter;
	void init(){
		memset(go, 0, sizeof(go)); fail = NULL; ter = false;
	}
}pool[maxn], *root;
int tot;

void insert(char *c){
	int len = strlen(c); Trie *p = root;
	for (int i = 0; i < len; i++){
		if (p->go[c[i] - 'a'] != 0) p = p->go[c[i] - 'a'];
		else{
			pool[tot].init();
			p->go[c[i] - 'a'] = &pool[tot++];
			p = p->go[c[i] - 'a'];
		}
	}
	p->ter = true;
}

void getFail()
{
	queue<Trie*> que;
	root->fail = root;
	for (int i = 0; i < 26; i++){
		if (root->go[i]) {
			que.push(root->go[i]); root->go[i]->fail = root;
		}
		else{
			root->go[i] = root;
		}
	}
	while (!que.empty()){
		Trie *p = que.front(); que.pop();
		for (int i = 0; i < 26; i++){
			if (p->go[i]){
				que.push(p->go[i]);
				p->go[i]->fail = p->fail->go[i];
				p->go[i]->ter |= p->go[i]->fail->ter;
			}
			else{
				p->go[i] = p->fail->go[i];
			}
		}
	}
}

 

转载于:https://www.cnblogs.com/chanme/p/3670026.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值