(模板)AC自动机
2018-03-29 17:43
211 查看
说明链接:https://blog.csdn.net/creatorx/article/details/71100840
代码:(其中有个地方需要非常注意)
代码:(其中有个地方需要非常注意)
// luogu-judger-enable-o2 #include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<algorithm> #include<cstring> #include<string> using namespace std; struct node{ node*next1[26]; node*fail; int sum; node(){ memset(next1,0,sizeof(next1));fail=NULL;sum=0; } }*root=new node(); int cnt=0; void insert(string str) { node*p=root; for(int i=0;i<str.size();i++){ int x=str[i]-'a'; if(!p->next1[x]){ node*t=new node();p->next1[x]=t; } p=p->next1[x]; } p->sum++; } void build_fail_pointer(void) { node*p,*temp; queue<node*>que;que.push(root); while(!que.empty()){ temp=que.front();que.pop(); for(int i=0;i<26;i++){ if(temp->next1[i]){ if(temp==root){ temp->next1[i]->fail=root; } else{ p=temp->fail; while(p){ if(p->next1[i]){ temp->next1[i]->fail=p->next1[i];break; } p=p->fail; } if(!p)temp->next1[i]->fail=root; } que.push(temp->next1[i]); } } } } void ac_automation(string str) { node*p=root; for(int i=0;i<str.size();i++){ int x=str[i]-'a'; while(!p->next1[x]&&p!=root)p=p->fail; p=p->next1[x]; if(!p)p=root; node*temp=p; while(temp!=root){ if(temp->sum){ cnt+=temp->sum;temp->sum=0; } else break;//**如果不只是需要知道模式串是否出现过而** //**是要找出所有出现的位置的话,这一行是不能要的!!!!!!** //并且,根据观察,没有这一行似乎并不会导致答案错误,只是时间会增加; //但是,有这一行却可能导致答案错误 temp=temp->fail; } } } int main() { int n,i,j;string str; cin>>n; for(i=1;i<=n;i++){ cin>>str;insert(str); } cin>>str; build_fail_pointer();ac_automation(str); cout<<cnt<<endl; return 0; }
相关文章推荐
- 病毒侵袭持续中(我的第三道AC自动机---模板再次完善升级)
- hdu 3065 病毒侵袭持续中 ac自动机模板题
- HDU2222【AC自动机(基础·模板)】
- AC自动机(1)--hdu2222(基本模板)
- 【HDU2222】【AC自动机模板 测烂为止】Keywords Search
- HDU 2222 Keywords Search(我的第一道AC自动机,模板题)
- HDU-2222 Keywords Search (AC自动机模板)
- AC自动机模板
- [模板] - AC自动机 - 动态 - 感谢小太阳
- BZOJ 3172 [Tjoi2013] 单词 [AC自动机模板]
- hdu 3695 AC自动机模板题
- HDU 2222 (AC自动机模板)
- AC自动机模板
- AC自动机 ( 模板题啊 )——病毒侵袭持续中 ( HDU 3065 )
- HDOJ 2222.Keywords Search(AC自动机模板)
- ac自动机模板
- 数据结构--AC自动机--模板2
- AC自动机 模板与简单讲解 模板题:贴瓷砖
- AC自动机算法模板
- HDU 2222 Keywords Search 【AC自动机模板】