首页 > 代码库 > 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;}