[AcWing]835. Trie字符串统计

算法标签 Trie,字典树

题目简叙

[AcWing]835. Trie字符串统计_第1张图片

思路

多叉树存储字符串
利用公共前缀提高效率
如图,参照代码看:
思路不知道怎么写,都贴代码上了
[AcWing]835. Trie字符串统计_第2张图片

代码

#include
#include

using namespace std;

const int N = 2*1e4+10;
int tree[N][26];//多叉树,N表示总数,26表示子节点共有26个字母多个,值存储idx 
int cnt[N];//记录对应字符的出现的次数
int idx;//记录是全程第几个插入的字符,作为唯一的识别码
int n;
int p;//p是上一个字符串的到下一个字符串的下标,相当于链表的next数组,用来移动

void insert(string str){
    p=0;//p作为下标,初始化,表示也根节点
    for(int i=0;i<str.size();i++){
        if(!tree[p][str[i]-'a'])tree[p][str[i]-'a']=++idx;
        //如果当前这个字符不存在,那么创建,并存储当前是全场第几个数字
        p = tree[p][str[i]-'a'];//p是上一个字符串的到下一个字符串的下标,相当于链表的next数组,因为idx不清空,所以idx是全场唯一的标记,用来移动
    }    
    cnt[p]++;//此时的p继承了idx独一无二的特性,作为以对应字符结尾的字符串的数目+1
}

int query(string str){
    p=0;    
    for(int i=0;i<str.size();i++){
        if(!tree[p][str[i]-'a'])return 0;//如果不存在已完成的对应字符标记,那么退出,返回0
        p = tree[p][str[i]-'a'];//移动到下一个字符
    }    
    return cnt[p];//这个时候我们成功查询到最后一位了,通过唯一的标示,返回出现的次数
}
int main(){
    int n;
    cin>>n;
    
    string op;
    string tmp;
    while(n--){
        cin>>op;
        cin>>tmp;
        if(op[0]=='I')insert(tmp);
        else cout<<query(tmp)<<endl;
    }
    return 0;
}

AC记录

[AcWing]835. Trie字符串统计_第3张图片

你可能感兴趣的:(数据结构,Acwing,模板题)