Problem C[hdu5687]字典树

7 篇文章 0 订阅
这篇博客介绍了如何使用一个神奇的字典进行插入、删除和搜索操作。在字典中,可以插入一个单词,删除所有具有特定前缀的单词,或者查询某个字符串是否存在作为其他单词的前缀。通过示例输入和输出,展示了这些操作的实现和应用。
摘要由CSDN通过智能技术生成

题目描述:

度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:



  1、insert : 往神奇字典中插入一个单词



  2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词



  3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串
 

输入描述:

这里仅有一组测试数据。第一行输入一个正整数N (1\leq N\leq 100000)N(1≤N≤100000),代表度熊对于字典的操作次数,接下来NN行,每行包含两个字符串,中间中用空格隔开。第一个字符串代表了相关的操作(包括: insert, delete 或者 search)。第二个字符串代表了相关操作后指定的那个字符串,第二个字符串的长度不会超过30。第二个字符串仅由小写字母组成。

输出描述:

对于每一个search 操作,如果在度熊的字典中存在给定的字符串为前缀的单词,则输出Yes 否则输出 No。

样例输入 1:

5
insert hello
insert hehe
search h
delete he
search hello

样例输出 1: 

Yes
No

#include "bits/stdc++.h"
using namespace std;
int s[500005][36];
int k=1;
int sum[500005];
void insert(string &str){
    int p=0;
    for(int i=0;i<str.length();i++){
        if(!s[p][str[i]-'a'])s[p][str[i]-'a']=k++;  //插入
        p = s[p][str[i]-'a'];sum[p]++;
    }
    
}
bool search(string &str){
    int p=0;
    for(int i=0;i<str.length();i++){
        if(!s[p][str[i]-'a'])return false;  //查找
        p=s[p][str[i]-'a'];
    }
    return sum[p];
}
void del(string &str){//删除
    int p=0;
    int cnt=0;
    for(char i : str){
        if(!s[p][i-'a'])return; //如果没有前缀是他的会RE
        p = s[p][i-'a'];
    }

    cnt += sum[p];
    p = 0;
    for (auto i:str)  {
        p = s[p][i-'a']; //删除有关他的
        sum[p]-=cnt;
    }

    for (int i = 0; i < 26; i++) { //删除这字符串后链接的 等同于 删除以该字符为前缀的字符串
        s[p][i] = 0;
    }

}
int main(){
    int t;
    string s1,s2;
    cin>>t;
    while (t--){
        cin>>s1>>s2;
        if(s1=="insert"){
            insert(s2);
        }else if(s1=="search"){
            if(search(s2))cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        }else{
            del(s2);
        }
    }

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值