首页 > 代码库 > HDU 2222 Keywords Search
HDU 2222 Keywords Search
题目地址
AC自动机模板
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<algorithm> 5 using namespace std; 6 const int Nmax=1000005; 7 const int Totmax=500005; 8 struct Aho 9 { 10 struct State 11 { 12 int next[26]; 13 int cnt,fail; 14 }state_table[Totmax]; 15 16 int size; 17 queue<int> Q; 18 void init() 19 { 20 while(Q.size()) 21 Q.pop(); 22 for(int i=0;i<Totmax;i++) 23 { 24 for(int j=0;j<26;j++) 25 state_table[i].next[j]=-1; 26 state_table[i].fail=state_table[i].cnt=0; 27 } 28 size=1; 29 } 30 31 void insert(char *s) 32 { 33 int n=strlen(s); 34 int now=0; 35 for(int i=0;i<n;i++) 36 { 37 char c=s[i]; 38 if(state_table[now].next[c-‘a‘]==-1) 39 state_table[now].next[c-‘a‘]=size++; 40 now=state_table[now].next[c-‘a‘]; 41 } 42 state_table[now].cnt++; 43 } 44 45 void build() 46 { 47 Q.push(0); 48 state_table[0].fail=0; 49 while(Q.size()) 50 { 51 int now=Q.front(); 52 Q.pop(); 53 for(int i=0;i<26;i++) 54 { 55 if(now==0) 56 { 57 if(state_table[now].next[i]==-1) 58 state_table[now].next[i]=0; 59 else 60 { 61 state_table[ state_table[now].next[i] ].fail=0; 62 Q.push(state_table[now].next[i]); 63 } 64 } 65 else 66 { 67 if(state_table[now].next[i]==-1) 68 { 69 state_table[now].next[i]=state_table[ state_table[now].fail ].next[i]; 70 } 71 else 72 { 73 state_table[ state_table[now].next[i] ].fail=state_table[ state_table[now].fail ].next[i]; 74 Q.push(state_table[now].next[i]); 75 } 76 } 77 78 } 79 } 80 } 81 82 int match(char *s) 83 { 84 int n=strlen(s); 85 int ans=0; 86 int now=0; 87 for(int i=0;i<n;i++) 88 { 89 char c=s[i]; 90 now=state_table[now].next[c-‘a‘]; 91 if(state_table[now].cnt) 92 { 93 int u=now; 94 while(u) 95 { 96 ans+=state_table[u].cnt; 97 state_table[u].cnt=0; 98 u=state_table[u].fail; 99 }100 }101 }102 return ans;103 }104 105 }aho;106 char s[Nmax];107 int main()108 {109 int t;110 //freopen("in.in","r",stdin);111 scanf("%d",&t);112 while(t--)113 {114 int n;115 aho.init();116 scanf("%d",&n);117 while(n--)118 {119 scanf("%s",s);120 aho.insert(s);121 }122 scanf("%s",s);123 aho.build();124 printf("%d\n", aho.match(s)); 125 }126 return 0;127 }
HDU 2222 Keywords Search
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。