Problem C

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 2902    Accepted Submission(s): 793

Problem Description

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

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

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

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

Input

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

Output

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

Sample Input

 

5 insert hello insert hehe search h delete he search hello

Sample Output

 

Yes No

Source

2016"百度之星" - 资格赛(Astar Round1)

Recommend

liuyiding

分析:

插入是平常的插入,

查询的字典中前缀与该单词相同的数量,我们用一个sum记录每一个节点被增加的个数,找到输出即可

删除也是删除所有前缀等于s2的单词,也是利用sum,减去相应的前缀,最后全部清0


#include<cstdio>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<functional>
#include<cstring>
#include<string>
#include<cstdlib>
#include<iomanip>
#include<numeric>
#include<cctype>
#include<cmath>
#include<ctime>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
using namespace std;
#define N 300000+5
#define MAX 26typedef long long ll;const int maxnode=400000+100;//预计字典树最大节点数目
const int sigma_size=26;       //每个节点的最多儿子数
struct Trie
{int ch[maxnode][sigma_size];//ch[i][j]==k表示第i个节点的第j个儿子是节点kint val[maxnode];//val[i]==x表示第i个节点的权值为xint sum[maxnode];//sum[i]==x表示第i个节点的次数为x,便于删除int sz;//字典树一共有sz个节点,从0到sz-1标号//初始化void clear(){sz=1;memset(ch[0],0,sizeof(ch[0]));//ch值为0表示没有儿子memset(sum,0,sizeof(sum));}//在字典树中插入单词s,但是如果已经存在s单词会重复插入且覆盖权值//所以insert前需要判断一下是否已经存在s单词了void insert(string s){ int u=0,n=s.length();for(int i=0;i<n;i++)///建立字典树{int id=s[i]-'a';if(ch[u][id]==0)//无该儿子{ch[u][id]=sz;memset(ch[sz],0,sizeof(ch[sz]));val[sz++]=0;}u=ch[u][id];sum[u]++;}val[u]=n;}//在字典树中查找单词sbool find1(string s){int n=s.length(),u=0;for(int i=0;i<n;i++){int id=s[i]-'a';if(ch[u][id]==0)return false;u=ch[u][id];}return val[u];}int find2(string s)///查找前缀为s的个数{int n=s.length(),u=0;for(int i=0;i<n;i++){int id=s[i]-'a';if(ch[u][id]==0)return 0;u=ch[u][id];}return sum[u];}void del(string s,int cnt) //删除前缀s的所有单词{int n=s.length(),u=0;for(int i=0;i<n;i++){int id=s[i]-'a';if(ch[u][id]==0)return ;u=ch[u][id];sum[u]-=cnt;}for(int i=0;i<26;i++)ch[u][i]=0;}
};
Trie trie;int main()
{int n;while(scanf("%d",&n)!=-1){trie.clear();for(int i=1;i<=n;i++){string s1,s2;cin>>s1>>s2;if(s1[0]=='i'){trie.insert(s2);}else if(s1[0]=='d'){trie.del(s2,trie.find2(s2));}else{if(trie.find2(s2)!=0){printf("Yes\n");}elseprintf("No\n");}}}return 0;
}

HDU 5687 Problem C 字典树相关推荐

  1. hdu 5687 Problem C 字典树

    传送门:hdu 5687 Problem C 中文题目就不做过多的解释 解题思路 定义一个结构体,里面有26个字母,就像下面这样: struct Node{int next[26];int sum;v ...

  2. hdu 5687 Problem C trie树

    Problem C Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Prob ...

  3. [ACM] hdu 1671 Phone List (字典树)

    [ACM] hdu 1671 Phone List (字典树) Phone List Problem Description Given a list of phone numbers, determ ...

  4. HDU 5687 Problem C (字典树)

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

  5. HDU 5536 Chip Factory 字典树+贪心

    给你n个数,a1....an,求(ai+aj)^ak最大的值,i不等于j不等于k 思路:先建字典树,暴力i,j每次删除他们,然后贪心找k,再恢复i,j,每次和答案取较大的,就是答案,有关异或的貌似很多 ...

  6. HDU - 1251 统计难题(字典树)

    题目链接:点击查看 题目大意:给出一些单词,后续再给出一些前缀,询问包含此前缀的单词一共有多少个 题目分析:这个题目的数据可能有点水,而且时间给的也很足,给了两秒,而且加上是hdu的,可以用无序map ...

  7. hdu 1251 统计难题 (字典树入门题)

    1 /******************************************************* 2 题目: 统计难题 (hdu 1251) 3 链接: http://acm.hd ...

  8. 2019 杭电多校 HDU - 6625 three arrays 字典树+贪心

    题目链接:https://cn.vjudge.net/problem/HDU-6625 题意:a和b两个数组n个数,数字任意组合异或,求得到c数组的字典序最小 题解:对于两个数组从高位到低位建立两个字 ...

  9. hdu 5687 Problem C

    点击打开链接 Problem C Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

最新文章

  1. Windows Ruby使用Mysql环境配置
  2. 依赖注入容器Unity Application Block快速入门
  3. 【Android 应用开发】Activity 返回堆栈清除操作 ( 默认状态 | 清除返回堆栈配置 | 不清除返回堆栈配置 | 清除指定界面配置 )
  4. Centos7 安装lnmp
  5. 设计模式:迭代器模式(Iterator)
  6. fx5u mc协议_三菱PLC编程入门:FX5U系列常见问题!
  7. 详解SSH框架和Redis的整合
  8. python是如何引起的_1.2.8 如何开始使用python
  9. 如何开发Linux内核?
  10. 记一次awvs14安装、破解之路~
  11. 前端预览PDF总结:iframe、embed、PDFObject、PDF.js
  12. VC及esxi升级的必要性和步骤
  13. 【用html做个人简历的网页(初级)】
  14. ESP8266-01实战一——带OLED显示屏电子时钟
  15. 奋斗(2)第12集剧情介绍
  16. axios封装request配置
  17. TestNG数据驱动
  18. redis主从配置(一主多从)
  19. uefl计算机mbr分区方案,免重装系统 手把手教你MBR转GPT分区表-电脑教程
  20. 华为系统鸿蒙的名字来源,鸿蒙系统名字含义_华为鸿蒙操作系统自己研发吗

热门文章

  1. 一个http请求工具
  2. 实心多边形重心的计算公式及推导
  3. 你真的了解ui-h5前端页面技术吗?
  4. Java开发快速学习!黑马java项目实战
  5. Mac生成ssh密钥
  6. SpringBoot ~ 邮件发送
  7. 论ERP顾问的创新分享与专业精神
  8. 中英文说明书丨艾美捷T7 RNA聚合酶介绍
  9. ubuntu16.04安装ceres及g2o
  10. Android AMS面试题