首页 > 代码库 > AC 自动机在这里
AC 自动机在这里
HDU 3065,模板(备忘录)
#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<queue>using namespace std;#define M 2222222char sx[1111][128];int n;char s[M];struct Trie{ int ch[M][128],end[M],fail[M],cnt,root; int b[M]; int Newnode(){ cnt++; memset(ch[cnt],-1,sizeof(ch[cnt])); end[cnt]=-1; fail[cnt]=-1; return cnt; } void init(){ cnt=0; root=Newnode(); memset(b,0,sizeof(b)); } void insert(char *s,int x){ int len=strlen(s),pos=root; for (int i=0;i<len;i++){ int v=s[i]; if (ch[pos][v]==-1) ch[pos][v]=Newnode(); pos=ch[pos][v]; } end[pos]=x; } queue<int> Q; void get_fail() { fail[root]=root; for (int i=0;i<128;i++){ if (ch[root][i]==-1) ch[root][i]=root; else { fail[ch[root][i]]=root; Q.push(ch[root][i]); } } while (!Q.empty()){ int pos=Q.front(); Q.pop(); for (int i=0;i<128;i++) if (ch[pos][i]==-1) ch[pos][i]=ch[fail[pos]][i]; else { fail[ch[pos][i]]=ch[fail[pos]][i]; Q.push(ch[pos][i]); } } } void query(char *s1){ int len=strlen(s1),pos=root; for (int i=0;i<len;i++){ if (s1[i]<‘A‘||s1[i]>‘Z‘) {pos=root;continue;} int temp=ch[pos][s1[i]]; pos=temp; while (temp!=root){ if (end[temp]!=-1) b[end[temp]]++; temp=fail[temp]; } } for (int i=1;i<=n;i++) if (b[i]) printf("%s: %d\n",sx[i],b[i]); }}AC;int main(){ while (scanf("%d",&n)!=EOF) { AC.init(); for (int i=1;i<=n;i++) { scanf("%s",sx[i]); AC.insert(sx[i],i); } AC.get_fail(); scanf("%s",s); AC.query(s); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。