AC 自动机在这里

HDU 3065,模板(备忘录)

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
#define M 2222222
char 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
",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;
}
 
原文地址:https://www.cnblogs.com/forgot93/p/3830459.html