HDU 5687 Problem C(Trie+坑)
Problem C
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1196 Accepted Submission(s): 371
1、insert : 往神奇字典中插入一个单词
2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词
3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串
题目链接: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+坑)的更多相关文章
- hdu 5687 Problem C trie树
Problem C Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Prob ...
- HDU 5687 Problem C 【字典树删除】
传..传送:http://acm.hdu.edu.cn/showproblem.php?pid=5687 Problem C Time Limit: 2000/1000 MS (Java/Others ...
- HDU 5687 Problem C ( 字典树前缀增删查 )
题意 : 度熊手上有一本神奇的字典,你可以在它里面做如下三个操作: 1.insert : 往神奇字典中插入一个单词 2.delete: 在神奇字典中删除所有前缀等于给定字符串的单词 3.search: ...
- HDU 5687 Problem C
Problem C Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total ...
- hdu 4825 Xor Sum(trie+贪心)
hdu 4825 Xor Sum(trie+贪心) 刚刚补了前天的CF的D题再做这题感觉轻松了许多.简直一个模子啊...跑树上异或x最大值.贪心地让某位的值与x对应位的值不同即可. #include ...
- 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 - ...
- HDU 5832 A water problem (带坑水题)
A water problem 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5832 Description Two planets named H ...
- HDU 5687 字典树插入查找删除
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687 2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解 #include< ...
- hdu 1251 统计难题 trie入门
统计难题 Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本 ...
随机推荐
- 安装CocoaPods遇到的问题 及其解决
本人也是第一次安装这个 CocoaPods,所以刚开始也是遇到了很多懵逼的问题,今天终于搞定了,就自己总结一下,如有错误敬请指出,谢谢! 由于之前,对于终端命令行,不是很了解,总感觉很麻烦,所以也一直 ...
- css属性选择器=,~=,^=,$=,*=,|=
http://www.w3school.com.cn/css/css_selector_attribute.asp =. property和value必须完全一致 : ~=.“约等于”?: ^=. 从 ...
- ssh: connect to host localhost port 22: Connection refused
1.hadoop安装好之后,执行ssh localhost无法执行, 提示“ssh: connect to host localhost port 22: Connection refused”. 2 ...
- 第十三篇、OC_UICollectionView的基本配置
- (UICollectionView *) categoryCollectionView { if (! _categoryCollectionView) { // 创建布局 UICollectio ...
- ASP.NET Core模块化前后端分离快速开发框架介绍之1、开篇
源码地址 GitHub:https://github.com/iamoldli/NetModular 演示地址 地址:https://nm.iamoldli.com 账户:admin 密码:admin ...
- 小象学院Python数据分析第二期【升级版】
点击了解更多Python课程>>> 小象学院Python数据分析第二期[升级版] 主讲老师: 梁斌 资深算法工程师 查尔斯特大学(Charles Sturt University)计 ...
- Ajax基础知识梳理
Ajax用一句话来说就是无须刷新页面即可从服务器取得数据.注意,虽然Ajax翻译过来叫异步JavaScript与XML,但是获得的数据不一定是XML数据,现在服务器端返回的都是JSON格式的文件. 完 ...
- tcl之基本语法—3
- windows7下将Cygwin加入右键菜单,并从当前目录打开
第一步:修改windows注册表 1·开始->运行(或者win键+R),输入REGEDIT,回车,打开注册表编辑器: 2·找到HKEY_CLASSES_ROOT\Directory\Backgr ...
- Codeforces Round #462 (Div. 2) D. A Determined Cleanup
D. A Determined Cleanup time limit per test1 second memory limit per test256 megabytes Problem Descr ...