Trie字符串统计

Trie字符串统计

摘自acwing模板题https://www.acwing.com/problem/content/837/

trie数的存储和查找

形如上面的树,左边的字符串是要存储的字符串,存完一个字符串在他的末尾记录一个标记(方便查找操作)

存储:
存储的时候,一个字符就存放成一个结点,结尾字符打标记.

查找:
查找的时候如果查找到下一个字符不匹配就查找失败
如果查找到,虽然找到了匹配字符但没有标记说明没有存储这个字符串,查找失败
如果查找到最后没有匹配,查找失败

代码

#include<iostream>

using namespace std ;

const int N = 100010 ;

int son[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(!son[p][u]) son[p][u] = ++ idx;
        p = son[p][u];
    }
    cnt[p] ++;
}

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


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

posted @ 2022-07-31 02:04  r涤生  阅读(34)  评论(0编辑  收藏  举报