度熊的字典

题目描述
度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:
1、insert : 往神奇字典中插入一个单词
2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词
3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串

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

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

样例输入
5
insert hello
insert hehe
search h
delete he
search hello
样例输出
Yes
No
提示
1≤N≤100000 第二个字符串的长度不会超过30

我恨trie树。。。离考试结束20分钟才发现原来的程序有问题,一通乱改还是回天乏术,据说暴力都有八九十,而我直接爆0。。。longpo的数据什么时候才能变强啊。。。

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int t,x,j,len,tot;
char s[10],a[35];
int b[35];
struct ty
{
    int Next[26];
    int cnt; 
    void init()
    {
        memset(Next,-1,sizeof(Next));
        cnt=0;
    }
}p[1000005];
void insert(char *s)
{
    x=0;
    len=strlen(s);
    for(int i=0;i<len;i++) 
    {
        j=s[i]-'a';
        if(p[x].Next[j]==-1) 
        {
            tot++;
            p[tot].init();
            p[x].Next[j]=tot;
        }
        x=p[x].Next[j];
        p[x].cnt++;
    }
}
void Delete(char *s)
{
    x=0;
    len=strlen(s);
    int k=0;
    for(int i=0;i<len;i++) 
    {
        j=s[i]-'a';
        if(p[x].Next[j]==-1) return;
        x=p[x].Next[j]; 
        k++;
        b[k]=x;
        if(p[x].cnt==0) return;
    }
    int d=p[x].cnt;
    for(int i=1;i<=k;i++) p[b[i]].cnt=p[b[i]].cnt-d;
    p[x].init();
}
int search(char *s)
{
    x=0;
    len=strlen(s);
    for(int i=0;i<len;i++) 
    {
        j=s[i]-'a';
        if(p[x].Next[j]==-1) return 0;
        x=p[x].Next[j];
        if(p[x].cnt==0) return 0;
    }
    return 1;
}
int main()
{
    p[0].init();
    cin>>t;
    while(t--) 
    {
        scanf("%s",s);
        if(s[0]=='i')
        {
            scanf("%s",a);
            insert(a);
        }
        if(s[0]=='d')
        {
            scanf("%s",a);
            Delete(a);
        }
        if(s[0]=='s')
        {
            scanf("%s",a);
            if(search(a)) printf("Yes\n");else printf("No\n");
        }
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值