码迷,mamicode.com
首页 > 其他好文 > 详细

[HDU 4787] GRE Words Revenge (AC自动机)

时间:2014-11-10 23:04:06      阅读:302      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   color   ar   sp   for   div   

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4787

题目大意:

给你若干个单词,查询一篇文章里出现的单词数。。

 

就是被我水过去的。。。暴力重建AC自动机- -然后暴力查找。。

 

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <queue>
  5 #include <map>
  6 #include <string>
  7 #include <set>
  8 using namespace std;
  9 
 10 #define CHARSET 2
 11 #define MAX_NODE 1010000
 12 
 13 int T,N;
 14 char inp[5000100];
 15 
 16 struct trieNode{
 17     int ch[CHARSET];
 18     int cnt;
 19     //bool vis;
 20 };
 21 trieNode trie[MAX_NODE];
 22 int ptr,fail[MAX_NODE];
 23 
 24 void init(){
 25     memset(fail,0,sizeof(fail));
 26     ptr = 0;
 27     for(int i=0;i<CHARSET;i++){
 28         trie[0].ch[i] = -1;
 29     }
 30     trie[0].cnt = 0;
 31     //trie[0].vis = false;
 32 }
 33 
 34 int newNode(){
 35     ptr++;
 36     for(int i=0;i<CHARSET;i++){
 37         trie[ptr].ch[i] = -1;
 38     }
 39     trie[ptr].cnt = 0;
 40     //trie[ptr].vis = false;
 41     return ptr;
 42 }
 43 
 44 void insert(const char* str,int L){
 45 //    printf("insert:");
 46     int len = strlen(str);
 47     int rt = 0;
 48     L %= len;
 49     for(int i=0;i<len;i++){
 50         //trie[rt].vis = true;
 51         int id = str[(i+L)%len] -0;
 52 //        printf("%d",id);
 53         if(trie[rt].ch[id]==-1){
 54             trie[rt].ch[id] = newNode();
 55         }
 56         rt = trie[rt].ch[id];
 57     }
 58     //trie[rt].vis = true;
 59     trie[rt].cnt = 1;
 60 //    puts("");
 61 }
 62 
 63 void build(){
 64     queue<int> q;
 65     //trie[0].vis = false;
 66     q.push(0);
 67     fail[0] = -1;
 68     while(!q.empty()){
 69         int t = q.front(); q.pop();
 70         for(int i=0;i<CHARSET;i++){
 71             int v = trie[t].ch[i];
 72             if( v==-1 ) continue;
 73 //            if( trie[v].vis ){
 74 //                trie[v].vis = false;
 75 //            } else continue;
 76             int f = fail[t];
 77             while(f!=-1&&trie[f].ch[i]==-1){
 78                 f = fail[f];
 79             }
 80             if(f==-1) fail[v] = 0;
 81             else fail[v] = trie[f].ch[i];
 82             q.push(v);
 83         }
 84     }
 85 }
 86 
 87 int query(const char *str,int L){
 88 //    printf("query:");
 89     int res = 0;
 90     int rt = 0;
 91     int len = strlen(str);
 92     L %= len;
 93     for(int i=0;i<len;i++){
 94         int id = str[(i+L)%len] - 0;
 95 //        printf("%d",id);
 96         while(rt&&trie[rt].ch[id]==-1) rt = fail[rt];
 97         rt = trie[rt].ch[id];
 98 
 99         if(rt==-1){
100             rt = 0;
101             continue;
102         }
103 
104         int now = rt;
105         while(now!=-1){
106             res += trie[now].cnt;
107             now = fail[now];
108         }
109     }
110 //    puts("");
111     return res;
112 }
113 
114 int main(){
115 //    freopen("output.txt","w",stdout);
116     scanf("%d",&T);
117     for(int t=1;t<=T;t++){
118         int L = 0;
119         init();
120         printf("Case #%d:\n",t);
121         scanf("%d",&N);
122         while(N--){
123             scanf("%s",inp);
124             if( inp[0]==+ ){
125                 insert(inp+1,L);
126             } else {
127                 build();
128                 int ans = query(inp+1,L);
129                 L = ans;
130                 printf("%d\n",ans);
131             }
132         }
133     }
134     return 0;
135 }

 

[HDU 4787] GRE Words Revenge (AC自动机)

标签:style   blog   http   io   color   ar   sp   for   div   

原文地址:http://www.cnblogs.com/llkpersonal/p/4088371.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!