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;
}
posted @ 2020-06-15 10:10  shuitiangong  阅读(104)  评论(0编辑  收藏  举报