HDU 1251 统计难题(trie)
解题思路
很裸的一道trie树的题目,因为要求出所有以某个字符串为前缀的单词数量,所以每次在插入的时候都让访问过的节点的cnt值加1就行了。
代码
const int maxn = 1e6+10;
char str[15];
int trie[maxn][26], cnt[maxn], num;
void insert() {
int len = strlen(str), p = 0;
for (int i = 0; i<len; ++i) {
int n = str[i]-'a';
if (!trie[p][n]) trie[p][n] = ++num;
p = trie[p][n];
++cnt[p];
}
}
int find() {
int len = strlen(str), p = 0;
for (int i = 0; i<len; ++i) {
if (!trie[p][str[i]-'a']) return 0;
p = trie[p][str[i]-'a'];
}
return cnt[p];
}
int main() {
while(gets(str)) {
if (!strlen(str)) break;
insert();
}
while(gets(str)) printf("%d\n", find());
return 0;
}