Trie树

Trie用于高效地存储和查找字符串集合的数据结构

比如字符串abcd, abce, ac, ba, bc

Trie的存储结构如下图所示,其中字符串结尾会有特殊标记

                    root

                             /      \

                          a        b

                        /   \      /  \

                      b     c   a   c

                    /

                 c

              /     \

           d        e 

  

这里用二维数组实现trie树, 假设树中只有小写字母结点

1 int son[N][26];

二维数组son[ i ][ j ], i 表示父结点的索引,j 表示当前字母,比如son[300][a]表示父结点为300,当前结点为a的字符串

1 int idx;

idx表示索引,表示当前有多少种情况

1 int cnt[N];

cnt[ i ]表示索引为i的字符串出现情况

 

代码如下:

#include <iostream>

using namespace std;

const int N = 100010;

int son[N][26], size, cnt[N];
int idx;

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 temp[N];
        char ch[2];
        scanf("%s%s", ch, temp);
        if(*ch == 'I') insert(temp);
        else printf("%d\n", query(temp));
    }
}

 

posted @ 2019-07-24 01:41  roov  阅读(3)  评论(0编辑  收藏  举报