Trie练手题。
算了下,静态分配内存貌似会MLE?不过看别人的代码开 2e6 * 26 的数组竟然过了? = =
嘛,写了个动态的。。
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
using namespace std;
#define rep(i, s, t) for(int (i)=(s);(i)<=(t);++(i))
#define urep(i, s, t) for(int (i)=(s);(i)>=(t);--(i))
typedef long long LL;
const int inf = 0x7fffffff;
static const int CHAR_SET = 26;
static const int BASE = 'a';
struct Node {
int flag;
int id;
Node *ch[CHAR_SET];
};
struct Trie {
Node *root;
int id[BASE+CHAR_SET+1]; // 字符->int
int n;
void add(const char *s, int flag) {
Node * p = root;
while (*s) {
int i = id[*s];
if (p->ch[i] == NULL) {
make_node(p->ch[i]);
p->ch[i]->id = -1;
//cout << "add edge: " << *s << " id " << i << " add node: " << n << endl;
++n;
}
++s;
p = p->ch[i];
if (p->id != flag) {
p->flag += 1;
p->id = flag;
}
//cout << "reach node: " << (p->id) << endl;
//if (p == root->ch[0]) cout << "1" << endl;
}
}
int search(const char * T) {
const char *s = T;
Node *p = root;
while (*s) {
//cout << "pass: " << *s << " ori: " << T << endl;
int i = id[*s];
if ( (p=p->ch[i]) == NULL ) return 0;
s++;
}
return p->flag;
}
void init() {
for (int i=0;i<CHAR_SET;++i)
id[BASE+i] = i;
n = 1;
make_node(root);
}
void clear(Node** ptr) {
for (int i=0;i<CHAR_SET;++i) *(ptr+i) = NULL;
}
void make_node(Node* & ptr) {
ptr = new Node;
clear(ptr->ch);
ptr->flag = 0;
}
void Destroy() {
destroy(root);
}
void destroy(Node* & ptr) {
if (ptr == NULL) return;
for (int i=0;i<CHAR_SET;++i)
destroy(ptr->ch[i]);
delete ptr;
}
};
Trie trie;
char buf[105];
int main() {
#if 1
freopen("input.in", "r", stdin);
#endif
iostream::sync_with_stdio(0);
int P, Q;
cin >> P;
trie.init();
rep(i, 0, P-1) {
cin >> buf;
char *p = buf;
while (*p) {
trie.add(p, i);
++p;
}
}
cin >> Q;
rep(i, 0, Q-1) {
cin >> buf;
cout << trie.search(buf) << endl;
}
return 0;
}