AC自动机模板
2017-03-06 16:17
369 查看
AC自动机的功能类似于kmp,用于处理多个子串匹配一个母串的问题。
主要思想是:先建立一颗trie树,然后再把空的节点补全为fail所指向的点,也就是补全一颗树,最后记得更新tag值就完了
主要思想是:先建立一颗trie树,然后再把空的节点补全为fail所指向的点,也就是补全一颗树,最后记得更新tag值就完了
#include <iostream> using namespace std; void add(char *str){//构建trie树 我的变量名错了(大雾) int p=1; int len=strlen(str); for(i=0;i<len;i++){ if(tri[p][str[i]-'a']==0){ trilen++; tri[p][str[i]-'a']=trilen; } p=tri[p][str[i]-'a']; } tag[p]++; } int ACcreat(){//构建ac自动机 同时补全所有空的trie[i][j]指针 queue <int> q; fail[1]=1; for(i=0;i<26;i++){//先处理根节点的child的fail指针 if(tri[1][i]){ fail[tri[1][i]=1; q.push(tri[1][i]); } else tri[1][i]=1; } int u; while(!q.empty()){//广搜所有的点 可以保证所有的fail指针之前都访问过 u=q.front(); q.pop(); for(int i=0;i<26;i++){ if(tri[u][i]){ fail[tri[u][i]]=tri[fail[u]][i]; q.push(tri[u][i]); } else tri[u][i]=tri[fail[u]][i]; } tag[u]+=tag[fail[u]];//当前节点累计结束串个数 } } int main(){ scanf("%d",&m); scanf("\n%d",mstr); for(i=1;i<=m;i++){ scanf("\n%s",str); add(str); } return 0; }
相关文章推荐
- 模板_AC自动机
- HDU 3065 病毒侵袭持续中(AC自动机模板)
- Hdu 5384 Danganronpa (AC自动机模板)
- AC自动机模板(hdu2222)
- ac自动机模板
- HDU 2222 AC自动机模板题
- AC自动机模板
- hdu2222 ac自动机模板
- AC自动机模板
- Trie树、AC自动机模板
- P3796 【模板】AC自动机(加强版)
- 字典树模板/ac自动机模板
- AC自动机-HDU2896-模板题
- 模板 AC自动机
- HDU 2222 AC自动机 模板
- HDU 2222 Keywords Search(AC自动机模板)
- NYOJ 1085 AC自动机基础模板
- 【洛谷】3796 【模板】AC自动机(加强版)
- HDU2896.病毒侵袭中【MLE和PE的原因】【AC自动机模板题】
- AC自动机模板