典型的Trie树。
将所有的商品名字一段一段的输入,为了避免类似badad在统计ad时变成2这样多加了的情况,我们在insert时引入id。
这样能避免同一商品的重复增加。
另外G++和C++的内存分配好像不太一样,用C++能够AC但是用G++就会超内存。
不过Trie对内存的占用也是出了名的….
//HDU2846
#include <cstdio>
#include <cstring>
struct Trie {
int cnt;
int id;
Trie *next[26];
};
void init(Trie *root) {
for (int i = 0; i < 26; i++) {
root->next[i] = NULL;
}
root->cnt = 0;
root->id = -1;
}
Trie *build() {
Trie *p = new Trie;
init(p);
return p;
}
void insert(Trie *root, char *s, int len, int id) {
Trie *p = root;
for (int i = 0; i < len; i++) {
int idx = s[i] - 'a';
if (p->next[idx] == NULL) {
p->next[idx] = new Trie;
init(p->next[idx]);
}
p = p->next[idx];
if (p->id != id) {
p->id = id;
p->cnt++;
}
}
}
int search(Trie *root, char *s, int len) {
Trie *p = root;
for (int i = 0; i < len; i++) {
int idx = s[i] - 'a';
if (p->next[idx] == NULL) {
return 0;
}
p = p->next[idx];
}
return p->cnt;
}
int main()
{
Trie *rt = build();
int n, m;
scanf("%d", &n);
char s[25];
for (int i = 0; i < n; i++) {
scanf("%s", s);
for (int j = 0; j < strlen(s); j++) {
insert(rt, s + j, strlen(s) - j, i);
}
}
scanf("%d", &m);
while (m--) {
scanf("%s", s);
printf("%d\n", search(rt, s, strlen(s)));
}
return 0;
}