博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「模板」AC自动机(ACAM)
阅读量:4494 次
发布时间:2019-06-08

本文共 2353 字,大约阅读时间需要 7 分钟。

#include 
#include
#include
#include
using namespace std;const int MAXN=160,MAXM=11000,MAXL=1000010;char str[MAXN][80],p[MAXL];int n;class ACAM{ public: void Init(void) { tot=0; memset(cnt,0,sizeof cnt); memset(s,0,sizeof s); } void Insert(char *str,int k) { int x=0; for(int i=0,t;str[i];++i) { if(!s[x].c[t=num(str[i])]) s[x].c[t]=++tot; x=s[x].c[t]; } s[x].index=k; } void GetFail(void) { queue
q; for(int i=1,t;i<=26;++i) if(t=s[0].c[i]) { s[t].fail=0; q.push(t); } while(!q.empty()) { int x=q.front(); q.pop(); for(int i=1,t,f;i<=26;++i) if(t=s[x].c[i]) { f=s[t].fail=s[s[x].fail].c[i]; s[t].lst=s[f].index?f:s[f].lst; q.push(t); } else s[x].c[i]=s[s[x].fail].c[i]; } } void Search(char *p) { int x=0,ans=0; for(int i=0;p[i];++i) { if(s[x=s[x].c[num(p[i])]].index) ++cnt[s[x].index]; for(int j=s[x].lst;j;j=s[j].lst) ++cnt[s[j].index]; } for(int i=1;i<=n;++i) ans=max(ans,cnt[i]); printf("%d\n",ans); for(int i=1;i<=n;++i) if(cnt[i]==ans) printf("%s\n",str[i]); } private: int tot,cnt[MAXN]; struct node { int index,fail,lst,c[27]; }s[MAXM]; int num(char c) { return c-'a'+1; }}AC;int main(int argc,char *argv[]){ while(scanf("%d",&n) && n) { AC.Init(); for(int i=1;i<=n;++i) { scanf("%s",str[i]); AC.Insert(str[i],i); } AC.GetFail(); scanf("%s",p); AC.Search(p); } return 0;}

转载于:https://www.cnblogs.com/Capella/p/8043254.html

你可能感兴趣的文章
AngularJS
查看>>
DBCP、C3P0、Proxool 、 BoneCP开源连接池的比较
查看>>
[.NET WebAPI系列01] WebAPI 简单例子
查看>>
[leetcode] Minimum Path Sum
查看>>
PAT乙级1021.个位数统计(15 分)
查看>>
强化学习Q-Learning算法详解
查看>>
Spring MVC
查看>>
winform treeview 复选框,父节点子节点联动Bug
查看>>
C#_委托类型以及Action/Fanc_2018Oct
查看>>
es数组去重的简写
查看>>
Training Logisches Denken
查看>>
谁分配谁释放
查看>>
正则表达式
查看>>
Java集合之LinkedHashSet源码分析
查看>>
David Silver强化学习Lecture1:强化学习简介
查看>>
开源项目
查看>>
mvc4 找到多个与名为“xx”的控制器匹配的类型
查看>>
unix系统内核优点
查看>>
协议(五)-从电报机到智能手机
查看>>
Solr学习
查看>>