您的位置:首页 > 其它

AC自动机模板

2014-04-17 09:53 344 查看
看了别人写的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];
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: