【HDOJ】1277 全文检索

AC自动机,静态数组,动态分配TLE。

  1 /* 1277 */
  2 #include <iostream>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <cstdlib>
  6 #include <queue>
  7 using namespace std;
  8 
  9 #define MAXL 60005
 10 #define TRIEN 10
 11 
 12 typedef struct Trie {
 13     int n;
 14     Trie *fail;
 15     Trie *next[TRIEN];
 16 } Trie;
 17 
 18 Trie tries[1000024];
 19 int nTrie;
 20 char s[MAXL];
 21 char str[65];
 22 int ans[10005], n;
 23 bool flag;
 24 Trie *root;
 25 
 26 Trie *newNode() {
 27     memset(tries[nTrie].next, 0, sizeof(tries[nTrie].next));
 28     tries[nTrie].n = 0;
 29     tries[nTrie].fail = NULL;
 30     return &tries[nTrie++];
 31 }
 32 
 33 void create(char str[], int v) {
 34     int i = 0, id;
 35     Trie *p = root, *q;
 36 
 37     while (str[i]) {
 38         id = str[i] - '0';
 39         ++i;
 40         if (p->next[id] == NULL) {
 41             q = newNode();
 42             p->next[id] = q;
 43         }
 44         p = p->next[id];
 45     }
 46     p->n = v;
 47 }
 48 
 49 void build_fail() {
 50     int i;
 51     Trie *p, *q;
 52     queue<Trie *> Q;
 53 
 54     for (i=0; i<TRIEN; ++i) {
 55         if (root->next[i]) {
 56             root->next[i]->fail = root;
 57             Q.push(root->next[i]);
 58         }
 59     }
 60 
 61     while (!Q.empty()) {
 62         p = Q.front();
 63         Q.pop();
 64         for (i=0; i<TRIEN; ++i) {
 65             if (p->next[i]) {
 66                 q = p->fail;
 67                 while (q) {
 68                     if (q->next[i]) {
 69                         p->next[i]->fail = q->next[i];
 70                         break;
 71                     }
 72                     q = q->fail;
 73                 }
 74                 if (q == NULL)
 75                     p->next[i]->fail = root;
 76                 Q.push(p->next[i]);
 77             }
 78         }
 79     }
 80 }
 81 
 82 void search(char s[]) {
 83     int i = 0, id;
 84     Trie *p = root, *q;
 85 
 86     while (s[i]) {
 87         id = s[i] - '0';
 88         ++i;
 89         while (p->next[id]==NULL && p!=root)
 90             p = p->fail;
 91         p = p->next[id];
 92         if (p == NULL)
 93             p = root;
 94         q = p;
 95         while (q != root) {
 96             if (q->n) {
 97                 flag = true;
 98                 ans[n++] = q->n;
 99                 q->n = 0;
100             }
101             q = q->fail;
102         }
103     }
104 }
105 
106 void del(Trie *t) {
107     if (t == NULL)
108         return ;
109     for (int i=0; i<TRIEN; ++i)
110         del(t->next[i]);
111     free(t);
112 }
113 
114 void init() {
115     n = 0;
116     flag = false;
117     nTrie = 0;
118     root = newNode();
119 }
120 
121 int main() {
122     int t, m;
123     int i, j, k;
124 
125     #ifndef ONLINE_JUDGE
126         freopen("data.in", "r", stdin);
127         //freopen("data.out", "w", stdout);
128     #endif
129 
130     while (scanf("%d %d", &t, &m) != EOF) {
131         for (i=0; i<t; ++i) {
132             scanf("%s%*c", str);
133             strcat(s, str);
134         }
135         getchar();
136         init();
137         for (i=1; i<=m; ++i) {
138             scanf("%*s %*s %*s %s", str);
139             create(str, i);
140         }
141         build_fail();
142         search(s);
143         if (flag) {
144             printf("Found key:");
145             for (i=0; i<n; ++i)
146                 printf(" [Key No. %d]", ans[i]);
147             printf("\n");
148         } else {
149             printf("No key can be found !\n");
150         }
151     }
152 
153     return 0;
154 }

 

posted on 2014-12-26 22:29  Bombe  阅读(172)  评论(0编辑  收藏  举报

导航