HDU5687 Problem C【字典树】
Problem C
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 2669 Accepted Submission(s): 736
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)
问题链接:HDU5687 Problem C
问题描述:(略)
问题分析:
这是一个字典树的问题。删除一个单词的做法比较特殊一些,需要注意。
程序说明:
这里采用静态存储分配,删除单词是存储并没有回收,会有一定的浪费。程序倒是AC了。
参考链接:(略)
题记:(略)
AC的C++语言程序如下:
/* HDU5687 Problem C */#include <iostream>
#include <stdio.h>
#include <string.h>using namespace std;const int N = 100000;
const int LEN = 30;
const int SIZE = 26;
const char SCHAR = 'a';struct Trie {int acnt; // access countint childs[SIZE];void init(){acnt = 1;memset(childs, 0, sizeof(childs));}
} trie[N * LEN];
int ncnt; // Trie Node count
char cmd[8], s[LEN + 1]; // Inputvoid insert(char s[])
{int p = 0;for(int i = 0; s[i]; i++) {int k = s[i] - SCHAR;int child = trie[p].childs[k];if(child) {trie[child].acnt++;p = child;} else {trie[++ncnt].init();trie[p].childs[k] = ncnt;p = ncnt;}}
}int query(char s[])
{int p = 0;for (int i = 0; s[i]; i++) {int k = s[i] - SCHAR;int child = trie[p].childs[k];if (child == 0)return 0;elsep = child;}return trie[p].acnt;
}void remove(char s[])
{int p = 0, last = 0, k;for (int i = 0; s[i]; i++) {k = s[i] - SCHAR;int child = trie[p].childs[k];if (child == 0)return;else {last = p;p = child;}}trie[last].childs[k] = 0;int cnt = trie[p].acnt;p = 0;for (int i = 0; s[i + 1]; i++) {k = s[i] - SCHAR;p = trie[p].childs[k];trie[p].acnt -= cnt;}
}int main()
{int n;scanf("%d", &n);while(n--) {scanf("%s%s", cmd, s);if(cmd[0] == 'i')insert(s);else if(cmd[0] == 's')printf("%s\n", query(s) ? "Yes" : "No");else if(cmd[0] == 'd')remove(s);}return 0;
}
HDU5687 Problem C【字典树】相关推荐
- HDU 5687 Problem C 字典树
Problem C Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
- hdu 5687 Problem C 字典树
传送门:hdu 5687 Problem C 中文题目就不做过多的解释 解题思路 定义一个结构体,里面有26个字母,就像下面这样: struct Node{int next[26];int sum;v ...
- gym:Problem B Bless You Autocorrect!(字典树+最短路)
2016-2017-acmicpc-nordic-collegiate-programming-contest-ncpc-2016 Problem B Bless You Autocorrect! 题 ...
- HDU 5687 Problem C (字典树)
题意: 度熊手上有一本神奇的字典,你可以在它里面做如下三个操作: 1.insert : 往神奇字典中插入一个单词 2.delete: 在神奇字典中删除所有前缀等于给定字符串的单词 3.search: ...
- 字符串处理——字典树
[概述] 字典树,又称为单词查找树,Tire 树,是一种树形结构,它是哈希树的变种. 字典树与字典很相似,当要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典 ...
- BZOJ 3483 SGU505 Prefixes and suffixes(字典树+可持久化线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3483 [题目大意] 给出一些串,同时给出m对前缀后缀,询问有多少串满足给出的前缀后缀模 ...
- 2014百度之星 Xor Sum(字典树+贪心)
题目在HDU_OJ Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometh ...
- C++ __gnu_pbds(平板电视)超详细教程(C++内置的平衡树,字典树,hash)
整理的算法模板合集: ACM模板 目录 一.平衡树 例题:luogu P3369 [模板]普通平衡树 1. `rb_tree_tag`版 2. `splay_tree_tag`版 功能不够?自己添加! ...
- 0x16.基本数据结构 — Trie树(字典树)+ A C 自 动 机
目录 用TrieTrieTrie树来处理整数异或问题是真的舒服! 一.TrieTrieTrie树 TrieTrieTrie的基本操作 0.初始化 1.插入 2.检索 二.TrieTrieTrie树例题 ...
最新文章
- python sqlalchemy中文手册-基于Python的SQLAlchemy的操作
- ACM数论之旅17---反演定理 第一回 二项式反演(神说要有光 于是就有了光(´・ω・`))...
- POI导入大excel文件
- 文件上传流式处理commons-fileupload
- php调用数据库中的图片地址显示不出来,图片显示不出来,但是数据库里有显示...
- 11纯代码 oc xcode_iOS代码染色原理及技术实践
- osm数据导入mysql_OSM(OpenStreetMap) poi、路网 数据导入 PostgreSQL
- OpenGL基础31:混合
- scratch3.0 整体页面介绍
- Ring3加载驱动源码
- Python语言概述
- 词根词缀|pen/pend/peri/pet/photo等衍生单词
- Ripple 源码笔记
- 2018年大连海事大学校赛(ACM竞赛高校联盟训练赛 第11场)题解
- iMX6UL lvgl开发备忘
- 评测酷睿i5 12500h和i7 12650h差多少 i512500h和i712650h对比
- 女生双修计算机科学与技术,浙江大学计算机科学与技术学院数字媒体技术专业毕业作品展...
- MIC的常见问题分析
- iOS摸鱼周报 第二十四期
- 一个登录页面的测试用例——软件测试
热门文章
- GDAL库读取Envisat ASAR数据
- 使用GDAL工具对FY3系列卫星数据进行校正
- Modelbuilder进阶教程
- HiddenHttpMethodFilter过滤器—SpringMVC
- TweenLite中文帮助手册
- C#使用双堆栈创建队列
- 从零玩转Webpack4~5+实现原理笔记(二)
- 机器人社社长事迹_国际机器人大赛冠军背后的故事
- Linux 2.6 和安卓一样吗,Linux2.4和Linux2.6设备驱动的一些区别
- python要求将字符串循环右移n次_python 基础知识