AC自动机白书模板

#include<iostream>
#include<cstring>
#include<set>
#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<deque>
#include<list>
#include<algorithm>
#include<stdio.h>
#include<iomanip>

#define rep(i,n) for(int i=0;i<n;++i)
#define fab(i,a,b) for(int i=a;i<=b;++i)
#define fba(i,b,a) for(int i=b;i>=a;--i)
#define PB push_back
#define INF 0x3f3f3f3f
#define MP make_pair
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define sf scanf
#define pf printf
#define LL long long
const int N=1005;
using namespace std;
typedef pair<int,int>PII;
const int maxnode=10000;
const int sg=26;
char tmp[N][N];
struct Ac{
   int ch[maxnode][sg];
   int val[maxnode],f[N],last[N];
   int sz;
   Ac(){
       sz=1;
       memset(f,0,sizeof f);
       memset(last,0,sizeof last);
       memset(ch[0],0,sizeof ch[0]);
   }
   void init(){
       sz=1;
       memset(f,0,sizeof f);
       memset(last,0,sizeof last);
       memset(ch[0],0,sizeof ch[0]);
   }
   int idx(char x){
       return x-'a';
   }
   void insert(char* s,int v){
       int u=0,n=strlen(s);
       rep(i,n){
           int c=idx(s[i]);
           if(!ch[u][c]){
               memset(ch[sz],0,sizeof ch[sz]);
               val[sz]=0;
               ch[u][c]=sz++;
           }
           u=ch[u][c];
       }
       val[u]=v;
   }
   void print(int i,int j){
      if(j){
          pf(" %d %d %s %d\n",val[j],int(i-strlen(tmp[val[j]])+1),tmp[val[j]],i);

          print(i,last[j]);
      }
   }
   void getFail(){
      queue<int>Q;
      f[0]=0;
      rep(c,sg){
          int u=ch[0][c];
          if(u){
              f[u]=0;
              Q.push(u);
              last[u]=0;
          }
      }
      while(!Q.empty()){
          int r=Q.front();Q.pop();
          rep(c,sg){
              int u=ch[r][c];
              //if(!u)continue; //verson 1
              if(!u){ch[r][c]=ch[f[r]][c];continue;}//version 2
              Q.push(u);
              int v=f[r];
              while(v&&!ch[v][c])v=f[v];
              f[u]=ch[v][c];
              last[u]=val[f[u]]?f[u]:last[f[u]];
          }
      }
   }
   void find(char* T){
       getFail();
       int n=strlen(T);
       int j=0;
       rep(i,n){
           int c=idx(T[i]);
           //while(j&&!ch[j][c])j=f[j]; verson 1
           j=ch[j][c];
           if(val[j])print(i,j);
           else if(last[j])print(i,last[j]);
       }
   }
}ac;
int main(){
    ac.init() ;
    int n;
    sf("%d",&n);
    rep(i,n){
        sf("%s",tmp[i+1]);
        ac.insert(tmp[i+1],i+1);
    }
    sf("%s",tmp[n+1]);
    ac.find(tmp[n+1]);
    return 0;
}

 

posted on 2014-10-25 22:46  wanggp3  阅读(107)  评论(0编辑  收藏  举报

导航