[ACW]835Trie树字符串统计

题目链接

tips:

  1.每一个出现的结点(字符字母)都会有唯一一个编号idx(也即rxc说的指针),不是按层数来编的,是按出现的先后顺序编的

  2.将字母映射成数字进行编号存储

//12:10开始讲代码
#include<iostream>
#include<cstdio>

using namespace std;

const int N=10010;

//idx同单链表,当前用到了哪个下标
int son[N][26],cnt[N],idx;//下标是0的点,既是根结点,又是空结点
char str[N];


void insert(char str[]){
    int p=0;
    for(int i=0;str[i];i++){
        int u=str[i]-'a';//将字母映射成数字
        //如果p不存在u这个儿子,就把它创建出来
        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;
    scanf("%d" ,&n);
    while(n--){
        char op[2];
        scanf("%s%s",op,str);
        if(op[0] == 'I') insert(str);
        else printf("%d\n",query(str));
    }
}
View Code
posted @ 2020-01-16 18:57  SUMay  阅读(100)  评论(0编辑  收藏  举报