【HDU 2222】Keywords Search AC自动机模板题

参考iwtwiioi的模板写出来的。上午gty讲的并没有听懂,只好自己慢慢对着模板理解。

在HDU上为什么相同的程序提交有时T有时A!!!

奉上sth神犇的模板(不是这道题):

var
   ch:char;
   q,g,num:array [0..500001] of longint;
   st:string;
   son:array [0..500001,'a'..'z'] of longint;
   ts:array [0..1000001] of char;
   l,s,t,n,i,j,m,k,ans,head,tail:longint;
begin
   readln(t);
   while t<>0 do
   begin
      for ch:='a' to 'z' do begin son[0,ch]:=1; son[1,ch]:=0; end; 
      dec(t);
      s:=1;
      g[1]:=0;
      fillchar(num,sizeof(num),0);
      readln(n);
      for i:=1 to n do begin
         readln(st);
         m:=length(st);
         l:=1;
         for j:=1 to m do
            if son[l,st[j]]<>0 then l:=son[l,st[j]]
               else begin
                  inc(s);
                  g[s]:=0;
                  son[l,st[j]]:=s;
                  l:=s;
                  for ch:='a' to 'z' do son[s,ch]:=0;
               end;
         inc(num[l]);
      end;
      s:=1;
      head:=0;
      tail:=1;
      q[1]:=1;
      n:=0;
      while head<tail do
      begin
         inc(head);
         k:=q[head];
         for ch:='a' to 'z' do
            if son[k,ch]=0 then son[k,ch]:=son[g[k],ch]
                         else begin g[son[k,ch]]:=son[g[k],ch];
                                    inc(tail);
                                    q[tail]:=son[k,ch]; 
                              end;
      end;

  

然后是我的ACcode:

#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i));
using namespace std;
char a[10010],s[1000010];
int ch[500010][30],fail[500010],w[500010],ans,cnt;
inline void ins(char *b){
    int u=0,v,len=strlen(b);
    for2(i,0,len){
        v=b[i]-'a';
        if (!ch[u][v])ch[u][v]=cnt++;
        u=ch[u][v];
    }w[u]++;
}
inline void bfs(){
    queue<int>q;
    q.push(0);
    int u,p;
    while (!q.empty()){
        u=q.front();q.pop();
        for2(i,0,26) if (ch[u][i]){
            q.push(ch[u][i]);
            if (!u) continue;
            p=fail[u];
            while (p&&!ch[p][i])p=fail[p];
            fail[ch[u][i]]=ch[p][i];
        }
    }
}
inline void ac(char *b){
    int u=0,v,len=strlen(b),t;
    for2(i,0,len){
        v=b[i]-'a';
        while (u&&!ch[u][v])u=fail[u];
        u=ch[u][v];
        t=u;
        while (t){
            ans+=w[t];
            w[t]=0;
            t=fail[t];
        }
    }
}
inline void init(){CC(fail,0);CC(ch,0);CC(w,0);ans=0;cnt=1;}
int main(){
    int T;scanf("%d",&T);
    while (T--){
        init(); int n;
        scanf("%d",&n);
        for1(i,1,n){
            scanf("%s",a);
            ins(a);
        }bfs();
        scanf("%s",s);
        ac(s);
        printf("%d\n",ans);
    }return 0;
}

  

posted @ 2016-02-19 17:02  abclzr  阅读(176)  评论(0编辑  收藏  举报