HDU 5687 Problem C 【字典树删除】
传..传送:http://acm.hdu.edu.cn/showproblem.php?pid=5687
Problem C
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 2697 Accepted Submission(s): 743
1、insert : 往神奇字典中插入一个单词
2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词
3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串
insert hello
insert hehe
search h
delete he
search hello
No
解题思路:
输入查询都是字典树基本操作,这里的字典树的删除是一种标记删除而不是物理删除(非最后节点)。
但是这里的标记删除要注意的是不能直接取消标记或标记为 0 ,而是要根据要删除的字符串在字典中出现的次数,然后根据这个次数去更新路径上的点的标记。如果是删除字符的最后节点则进行物理删除。
例如说:字典里是 zzaizjja,zzaizjj,要删除 zzaizjja,如果单纯把路径 zzaizjja 上的节点都更新为0,则它的子串也 out 了,所以正确的更新是:路径上的点减去zzaizjja出现的次数。
AC Code:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#define INF 0x3f3f3f3f
#define LL long long int
#define Bits 26
using namespace std;
const int MAXN = ;
int N;
struct Trie
{
Trie *next[Bits];
int flag;
inline void init(){
this->flag = ;
for(int i = ; i < Bits; i++)
this->next[i] = NULL;
}
};
Trie *Root = (Trie *)malloc(sizeof(Trie));
inline void DelTrie(Trie *t)
{
if(t == NULL) return;
for(int i = ; i < Bits; i++){
if(t->next[i]!=NULL) DelTrie(t->next[i]);
}free(t);
return;
} void Create_Trie(char *str, bool isDel)
{
int len = strlen(str);
Trie *p = Root, *temp;
int Delnum = ;
for(int i = ; i < len; i++){
int index = str[i]-'a';
if(!isDel){
if(p->next[index] == NULL){
temp = (Trie *)malloc(sizeof(Trie));
temp->init();
p->next[index] = temp;
p = p->next[index];
}
else{p->next[index]->flag+=; p=p->next[index];}
}
else{
if(p->next[index] != NULL){
Delnum = p->next[index]->flag;
p = p->next[index];
}else return;
}
}
if(isDel){
p = Root;
for(int i = ; i < len; i++){
int index = str[i]-'a';
if(p->next[index] == NULL) return;
if(i==len-){
DelTrie(p->next[index]);
p->next[index] = NULL;
return;
}
p->next[index]->flag-=Delnum;
p = p->next[index];
}
}
} bool Find_Trie(char *str)
{
int len = strlen(str);
Trie *p = Root;
for(int i = ; i < len; i++){
int index = str[i]-'a';
if(p->next[index] != NULL && p->next[index]->flag > )
p=p->next[index];
else return false;
}return true;
} int main()
{
Root->init();
scanf("%d", &N);
char str[MAXN], command[];
while(N--){
scanf("%s", command);
if(strcmp(command, "insert")==){
scanf("%s", str);
Create_Trie(str, false);
}
else if(strcmp(command, "delete")==){
//puts("zjj");
scanf("%s", str);
Create_Trie(str, true);
}
else{
scanf("%s", str);
if(Find_Trie(str)) puts("Yes");
else puts("No");
}
}DelTrie(Root);
return ;
}
HDU 5687 Problem C 【字典树删除】的更多相关文章
- HDU 5687 Problem C ( 字典树前缀增删查 )
题意 : 度熊手上有一本神奇的字典,你可以在它里面做如下三个操作: 1.insert : 往神奇字典中插入一个单词 2.delete: 在神奇字典中删除所有前缀等于给定字符串的单词 3.search: ...
- hdu 5687 Problem C trie树
Problem C Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Prob ...
- hdu 1671 Phone List 字典树
// hdu 1671 Phone List 字典树 // // 题目大意: // // 有一些电话号码的字符串长度最多是10,问是否存在字符串是其它字符串的前缀 // // // 解题思路: // ...
- HDU 5536 Chip Factory 【01字典树删除】
题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=5536 Chip Factory Time Limit: 18000/9000 MS (Java/Ot ...
- Chip Factory HDU - 5536 字典树(删除节点|增加节点)
题意: t组样例,对于每一组样例第一行输入一个n,下面在输入n个数 你需要从这n个数里面找出来三个数(设为x,y,z),找出来(x+y)^z(同样也可以(y+z)^1)的最大值 ("^&qu ...
- HDU 5687 Problem C(Trie+坑)
Problem C Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
- HDU 5536 Chip Factory 字典树
Chip Factory Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...
- HDU 5536 Chip Factory 字典树+贪心
给你n个数,a1....an,求(ai+aj)^ak最大的值,i不等于j不等于k 思路:先建字典树,暴力i,j每次删除他们,然后贪心找k,再恢复i,j,每次和答案取较大的,就是答案,有关异或的貌似很多 ...
- hdu 6059---Kanade's trio(字典树)
题目链接 Problem Description Give you an array A[1..n],you need to calculate how many tuples (i,j,k) sat ...
随机推荐
- Python学习 day06
一.== 和 is == 比较的是值 is 比较的是地址 id() -- 返回对象的内存地址 例: 赋值操作是将地址赋给变量 Python 中会实现创建一个小型的整形池,范围为 [-5,25 ...
- ABP Zero集成微信小程序登录
首先是ABPZero的第三方登录模块,通过调用第三方的登录接口返回用户信息,再交给ABP的登录验证模块去执行对应的登录注册. 涉及的数据库表主要是这两个表,AbpUsers存储了用户信息,AbpUse ...
- HashMap和Hashtable的实现原理
HashMap和Hashtable的底层实现都是数组+链表结构实现的,这点上完全一致 添加.删除.获取元素时都是先计算hash,根据hash和table.length计算index也就是table数组 ...
- vue嵌套路由 && 404重定向
第一部分: vue嵌套路由 嵌套路由是什么? 嵌套路由就是在一个被路由过来的页面下可以继续使用路由,嵌套也就是路由中的路由的意思. 比如在vue中,我们如果不使用嵌套路由,那么只有一个<rou ...
- 第十八章:自定义splash screen、app icon和tab icon
本文介绍如何自定义splash screen.app icon和tab icon. 1. 自定义splash screen和app icon 1.1 产生resources文件夹,启动命令行: ion ...
- daterangepicker
官方文档 http://www.daterangepicker.com/#examples 与angular结合 html <div date-range-picker class=" ...
- git win7 dos下设置代理
git config --global http.proxy http://username:pwd@my.you.com:port
- 【转】CentOS6下安装mysql后,重置root密码方法
本文转自:CentOS6下安装mysql后,重置root密码方法 centos下安装mysql,居然不知道root用户密码,本想重装,不过还是先度娘了一些,发现这篇文章,刚好解决我的燃眉之急,太赞了. ...
- 数据挖掘:提取百度知道QA中的影视信息
1. 背景 网站上爬取了部分关于影视的百度知道QA,为了后续提高影视的搜索效果,需要基于百度知道QA的答案抽取相关的影视信息. 2. 流程 目前已有基础的媒资视频库信息,基于媒资视频库中的视频名称,构 ...
- lua 遍历table
lua中有四种主要的遍历一个table的方法. 第一种方法: for key, value in pairs(testtb) do xxxx end 这种方法是按照key哈希后的顺序遍历的.比如下面代 ...