AC自动机

AC自动机个人较浅的理解就是kmp的扩展,trie+kmp处理多个字符串匹配。

下面的是我的模板:

注:此模板根据notonlysuccess大牛的模板更改而来,代码更短,但速度有些下降,因为在init()内做了大量的的memset()


#define FOR(i,n)	for(int i=0; i<n; i++)
#define CC(A,x)		memset(A,x,sizeof(A))

const int NN=5001, CH=26;
struct Trie{
	inline int sw(char *c){return *c-'a';}
	void init(){CC(chd,0); CC(F,0); CC(W,0); sz=1;}
	void insert(char *s, int val){
		int p = 0;
		for (int v; *s; p=chd[p][sw(s++)])
			if (!chd[p][v=sw(s)]) chd[p][v]=sz++;
		W[p] = val;
	}
	void AC(){
		int Q[NN], *b=Q, *e=Q, v;
		FOR(i,CH) if(v=chd[0][i]) *e++ = v;
		for (int p=*b; b!=e; p=*++b)
			FOR(i,CH) if(v=chd[p][i]){
				F[*e++ = v] = chd[F[p]][i];
			}else chd[p][i] = chd[F[p]][i];
	}
	int chd[NN][CH], F[NN], W[NN], sz;
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值