Trie树

#include <iostream>

using namespace std;

const int N=100010;

int son[N][26];//第一维表示父亲的位置,第二维存儿子的名字 表示儿子的位置
int cnt[N];//所有串以该点结尾的个数
int idx;//当前用到哪个下标 下标是0的点是根节点又是空结点
char str[N];//串

void insert(char str[])//存储插入操作
{
    int p=0;//从根节点开始遍历
    for(int i=0;str[i];i++)// 从前往后串结尾是'\0'
    {
        int u=str[i]-'a';//a~z——0~25 映射(子节点编号)
        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;//不存在返回0
        p=son[p][u];
    }
    return cnt[p];//返回以该节点结尾的数量
}

int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        char op[2];
        scanf("%s%s",op,str);
        if(op[0]=='I') insert(str);
        else cout<<query(str)<<endl;
    }

    return 0;
}
posted @   Eric`  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示