[AcWing]Trie树(图解)

主要利用Trie树的特点存储字符串集合

题目

图解:

题解:

#include<iostream>

using namespace std;

const int N = 100010;
int s[N][26], cnt[N], idx;
char str[N];

void insert(char *str)
{
    int p = 0;
    
    for(int i = 0; str[i]; i++)
    {
        int u = str[i] - 'a';
        if(!s[p][u]) s[p][u] = ++idx;
        p = s[p][u];
    }
    cnt[p]++;//不会插入abc和abd公用一个p,因为p与最后的idx相等,idx对于每个新插入的节点都不一样
}

int query(char *str)
{
    int p = 0;
    
    for(int i = 0; str[i]; i++)
    {
        int u = str[i] - 'a';
        if(!s[p][u]) return 0;//
        p = s[p][u];
    }
    return cnt[p];
}

int main()
{
    int n;
    scanf("%d", &n);
    while (n -- )
    {
        char op[2];
        scanf("%s%s", op, str);
        if (*op == 'I') insert(str);
        else printf("%d\n", query(str));
    }

    return 0;
}
posted @ 2020-11-04 12:04  herrhu  阅读(128)  评论(0)    收藏  举报