「 hihoCoder 1014 」Trie 树

标题真直接

题目大意

给你 $n$ 个字符串。存到一个字典中。又给你 $m$ 个询问,每个询问给一个字符串,在字典中查出有多少个字符串是以这个字符串为前缀。

解题思路

模板题啊

在每个点设置一个变量 $sig$ 表示有几个单词是以经过路径上的字符组成的串作为前缀的个数。

$Trie$ 树。在 $insert$ 操作时,把路径上经过的点的 $sig$ 加 $1$ 。

查询的时候直接输出 $sig$ 就是了

附上代码

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n, m;
char s[15];
struct node {
    int sig;
    node *nxt[30];
}*root;
inline node * build() {
    node *k = new(node);
    k->sig = 0;
    memset(k->nxt, NULL, sizeof(k->nxt));
    return k;
}
inline void insert(char *s) {
    char *word = s;
    node *rt = root;
    int id;
    while(*word) {
        id = *word - 'a';
        if(rt->nxt[id] == NULL)
            rt->nxt[id] = build();
        rt = rt->nxt[id];
        rt->sig ++;
        word ++;
    }
}
inline int query(char *s) {
    node *rt = root;
    char *word = s;
    int id;
    while (*word) {
        id = *word - 'a';
        if(rt->nxt[id] == NULL)
            return 0;
        rt = rt->nxt[id];
        word ++;
    }
    return rt->sig;
}
int main() {
    scanf("%d", &n);
    root = build();
    for(int i=1; i<=n; i++) {
        scanf("%s", s);
        insert(s);
    }
    scanf("%d", &m);
    for(int i=1; i<=m; i++) {
        scanf("%s", s);
        printf("%d\n", query(s));
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/bljfy/p/9569577.html