zoukankan      html  css  js  c++  java
  • 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;
    }
     
  • 相关阅读:
    Domain Model
    linux 后台运行命令
    morphia(3)-查询
    [八省联考2018] 劈配
    [BZOJ 3218] a+b Problem
    [学习笔记] KM算法
    [HNOI2013] 消毒
    [HNOI2014] 画框
    [HDU 6057] Kanade's convolution
    [模板] 任意模数多项式乘法
  • 原文地址:https://www.cnblogs.com/forgot93/p/3830459.html
Copyright © 2011-2022 走看看