Fork me on GitHub

Trie树

Trie树

  1. 字母的类型不会很多

开数组的时候str[maxn][26]

maxn是字符串长度,26是指每一层大概有几个位置

存储方法:

  1. a节点有没有存,没有就创建一个
  2. 在字母的结尾打一个标记表示有个单词

dijistra要用堆优化

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 10;
char str[maxn];
int son[maxn][26], cnt[maxn], idx;  // 下标是0的点,即是根节点,也是空节点 


void insert(char str[])
{
    int p = 0; // 根节点
    for (int i = 0; str[i]; i ++)
    {
        int x = str[i] - 'a';
        if(!son[p][x])  son[p][x] = ++ idx;  // 不能是i,i是字符长度,只能得到高度不是树的坐标寻找。
        p = son[p][x];
    }
    cnt[p] ++ ;
}


int query(char str[])
{
    int p = 0; // 根节点
    for (int i = 0; str[i]; i ++)
    {
        int x = str[i] - 'a';
        if(!son[p][x])  return 0;  // 不能是i,i是字符长度,只能得到高度不是树的坐标寻找。
        p = son[p][x];
    }
    return cnt[p];
}


int main()
{
    int n;
    char op[2];
    cin >> n;
    while (n--)
    {
        scanf("%s %s", &op, &str);
        if(op[0] == 'I') insert(str);
        else printf("%d\n", query(str));
    }
    return 0;
}
posted @ 2020-03-12 20:20  WalterJ726  阅读(195)  评论(0编辑  收藏  举报