基础算法学习--Trie

Trie算法模板题

Trie字符串统计

代码及注释

#include<iostream>

using namespace std;

const int N = 100010;

int n;
//son -> 所有的子节点,26对应题目出现的26个英文字母
//cnt -> 字符串出现的次数
//idx -> 当前可用的下标 idx == 0时可能时根节点也可能是空结点
int son[N][26],cnt[N],idx;

//插入操作
void ins(char str[]){
    int q = 0;  //相当于一个指针
    
    for(int i = 0;str[i];i ++){
        int u = str[i] - 'a';   //转换成下标
        //一定要注意是 ++ idx 不然从在0会多次开辟节点
        if(!son[q][u]) son[q][u] = ++ idx;  //如果子节点没东西,赋值
        
        q = son[q][u];  //移动指针
    }
    
    cnt[q] ++;  //该字符串出现次数加一
}

//求出现次数
int query(char str[]){
    int q = 0;
    
    for(int i = 0;str[i];i ++){
        int u = str[i] - 'a';   //转换成下标
        
        if(!son[q][u]) return 0;    //不存在该单词
        
        q = son[q][u];  //移动指针
    }
    
    return cnt[q];  //返回字符串出现的次数
}

int main(){
    cin >> n;
    
    
    while(n --){
        char op[2],str[N];
        
        scanf("%s%s",op,str);
        
        if(op[0] == 'I') ins(str);
        else cout << query(str) << endl;
    }
    
    return 0;
}
posted @ 2021-04-19 18:05  Xuuxxi  阅读(61)  评论(0)    收藏  举报