HDU2222,一道很裸的AC自动机。直接用模版,不解释。
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222
标程:
1 program ac; 2 type 3 trienode=record 4 next:array['a'..'z'] of longint; 5 cnt,shift:longint; 6 end; 7 var 8 i,j,k,tot,n,m:longint; 9 tree:array[1..100000] of trienode; 10 fin:string; 11 12 procedure insert(s:string); 13 var 14 i,k:longint; 15 begin 16 k:=1; 17 for i:=1 to length(s) do 18 if tree[k].next[s[i]]<>0 then k:=tree[k].next[s[i]] 19 else begin 20 inc(tot); 21 tree[k].next[s[i]]:=tot; 22 k:=tot; 23 end; 24 inc(tree[k].cnt); 25 end; 26 27 procedure makeshift; 28 var 29 head,tail,now,k:longint; 30 i:char; 31 queue:array[1..100000] of longint; 32 begin 33 fillchar(queue,sizeof(queue),0); 34 head:=0; tail:=1; tree[1].shift:=0; queue[1]:=1; 35 repeat 36 inc(head); head:=(head-1) mod 100000+1; 37 now:=queue[head]; k:=0; 38 for i:='a' to 'z' do 39 if tree[now].next[i]<>0 then begin 40 if now=1 then tree[tree[1].next[i]].shift:=1 41 else begin 42 k:=tree[now].shift; 43 while k<>0 do begin 44 if tree[k].next[i]<>0 then begin 45 tree[tree[now].next[i]].shift:=tree[k].next[i]; 46 break; 47 end; 48 k:=tree[k].shift; 49 end; 50 if k=0 then tree[tree[now].next[i]].shift:=1; 51 end; 52 inc(tail); tail:=(tail-1) mod 100000+1; 53 queue[tail]:=tree[now].next[i]; 54 end; 55 until head=tail; 56 end; 57 58 procedure query(s:string); 59 var 60 i,j,k,sum:longint; 61 begin 62 sum:=0; k:=1; 63 for i:=1 to length(s) do begin 64 k:=tree[k].next[s[i]]; 65 if k=0 then k:=1; 66 j:=k; 67 while (j<>1) and (tree[j].cnt<>-1) do begin 68 inc(sum,tree[j].cnt); 69 tree[j].cnt:=-1; 70 j:=tree[j].shift; 71 end; 72 end; 73 writeln(sum); 74 end; 75 76 begin 77 assign(input,'ac.in'); reset(input); 78 assign(output,'ac.out'); rewrite(output); 79 readln(m); 80 for i:=1 to m do begin 81 fillchar(tree,sizeof(tree),0); tot:=1; 82 readln(n); 83 for j:=1 to n do begin 84 readln(fin); 85 insert(fin); 86 end; 87 makeshift; 88 readln(fin); 89 query(fin); 90 end; 91 close(input); close(output); 92 end.