Problem C

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

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

题目链接:HDU 5687

本来以为是一道字典树水题,结果被坑了十几发WA,哭晕在厕所。

比较接近正解的写法是用一个cnt记录字典树路径上被覆盖的次数然后寻找的时候仅判断这个节点的cnt是否为0即可,然而这样做有一个比较恶心的bug想了很久才发现,考虑这样一个例子

100
i abcd
d abc
i abc
s abcd

显然上述过程中a-b-c-d的c-d会断开,然后又被接上,会输出Yes,实际上此时abc是存在的,abcd早就被delete掉了,原因就是在cnt变为0的时候没有把以前的“关系”解除掉,因此在删除的时候若一个节点的cnt变为0,则把这个节点的父亲节点的指针置空即可,即要让这个儿子消失

代码:

#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 100010;
struct Trie
{
int nxt[26];
int cnt;
void reset()
{
fill(nxt, nxt + 26, 0);
cnt = 0;
}
};
Trie L[N * 35];
int sz; void init()
{
sz = 1;
L[0].reset();
}
void update(char s[])
{
int cur = 0;
int len = strlen(s);
for (int i = 0; i < len; ++i)
{
int v = s[i] - 'a';
if (!L[cur].nxt[v])
{
L[sz].reset();
L[cur].nxt[v] = sz++;
}
cur = L[cur].nxt[v];
++L[cur].cnt;
}
}
bool Find(char s[])
{
int cur = 0;
int len = strlen(s);
for (int i = 0; i < len; ++i)
{
int v = s[i] - 'a';
if (!L[cur].nxt[v])
return false;
cur = L[cur].nxt[v];
}
return true;
}
void del(char s[])
{
int cur = 0;
int len = strlen(s);
int Min = INF;
for (int i = 0; i < len; ++i)
{
int v = s[i] - 'a';
if (!L[cur].nxt[v])
return ;
cur = L[cur].nxt[v];
if (L[cur].cnt < Min)
Min = L[cur].cnt;
}
if (Min)
{
int fa = 0;
for (int i = 0; i < len; ++i)
{
int v = s[i] - 'a';
int cur = L[fa].nxt[v];
L[cur].cnt -= Min;
if (!L[cur].cnt)//断开最开始的儿子即可,后面就不会再被用到
{
L[fa].nxt[v] = 0;
return ;
}
fa = cur;
}
}
}
int main(void)
{
int n;
char ops[10], s[35];
while (~scanf("%d", &n))
{
init();
while (n--)
{
scanf("%s%s", ops, s);
if (ops[0] == 'i')
update(s);
else if (ops[0] == 's')
puts(Find(s) ? "Yes" : "No");
else
del(s);
}
}
return 0;
}

HDU 5687 Problem C(Trie+坑)的更多相关文章

  1. hdu 5687 Problem C trie树

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

  2. HDU 5687 Problem C 【字典树删除】

    传..传送:http://acm.hdu.edu.cn/showproblem.php?pid=5687 Problem C Time Limit: 2000/1000 MS (Java/Others ...

  3. HDU 5687 Problem C ( 字典树前缀增删查 )

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

  4. HDU 5687 Problem C

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

  5. hdu 4825 Xor Sum(trie+贪心)

    hdu 4825 Xor Sum(trie+贪心) 刚刚补了前天的CF的D题再做这题感觉轻松了许多.简直一个模子啊...跑树上异或x最大值.贪心地让某位的值与x对应位的值不同即可. #include ...

  6. HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)

    6343.Problem L. Graph Theory Homework 官方题解: 一篇写的很好的博客: HDU 6343 - Problem L. Graph Theory Homework - ...

  7. HDU 5832 A water problem (带坑水题)

    A water problem 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5832 Description Two planets named H ...

  8. HDU 5687 字典树插入查找删除

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 #include< ...

  9. hdu 1251 统计难题 trie入门

    统计难题 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本 ...

随机推荐

  1. make 出错: /usr/bin/ld: cannot find -lrt

    make 出错:/usr/bin/ld: cannot find -lrtcollect2: ld returned 1 exit statusmake: *** [page_parser] Erro ...

  2. 安装Ubuntu桌面环境后只能Guest登录的解决办法

    1.安装Ubuntu桌面环境后,登录界面只显示了Guest 2.在登录界面按住crtl+shift+F1,进入tty模式 3.输入sudo -s进入root模式 4.输入vi /etc/lightdm ...

  3. 软件杯python-flask遇到的坑有感!

    大三下,对于我考研的人来说,时间不要太紧张,参加软件杯也是系主任要求,题目是公共地点人流量的检测,个人还是个菜鸟,但是把遇到的一些大家可能不小心会出现的问题贴出来,困扰我很久,还没睡好觉!!! Que ...

  4. Oracle下如何收集 Systemstate dump

    2: dump (不包括lock element) 10: dump 11: dump + global cache of RAC 256: short stack (函数堆栈) 258: 256+2 ...

  5. html +css 登陆框中加用户图片,并设置登陆名不盖住图标

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. CentOS 7 环境下挂载新磁盘

    最近某个项目需要给数据库服务器添加磁盘,由于太久没搞过,就给虚拟机加了10G的空间,用来练习一下磁盘的挂载 一. 首先执行"fdisk -l"命令,查看磁盘信息 [root@loc ...

  7. C语言的位运算的优势 !

    位运算加速技巧1. 如果乘上一个2的倍数数值,可以改用左移运算(Left Shift) 加速 300% x = x * 2; x = x * 64; //改为: x = x << 1; / ...

  8. day23-python之日志 re模块

    1.logging import logging #-----------------------------------logging.basicConfig logging.basicConfig ...

  9. Paper Folding UVA - 177 模拟+思路+找规律

    题目:题目链接 思路:1到4是很容易写出来的,我们先考虑这四种情况的绘制顺序 1:ru 2:rulu 3:rululdlu 4:rululdluldrdldlu 不难发现,相较于前一行,每一次增加一倍 ...

  10. Android四大组件之服务

    创建一个服务,并与活动绑定 作为安卓四大组件之一的服务,毫无例外也要在manifast中进行注册 新建服务类继承于Service,并覆盖onBind( )方法,用于与活动绑定 public class ...