[HDU5687]2016"百度之星" - 资格赛 Problem C
题目大意:有n个操作,每个操作是以下三个之一,要你实现这些操作。
1、insert : 往字典中插入一个单词
2、delete: 在字典中删除所有前缀等于给定字符串的单词
3、search: 查询是否在字典中有一个字符串的前缀等于给定的字符串
解题思路:Trie树即可。
注意代码第49行的判断,我当时以为只要成功搜到这个前缀就一定有答案,忽略了删除操作使某些前缀的单词数为0的情况。
C++ Code:
#include<cstdio>
struct node{
int cnt;
node* nxt[27];
node():cnt(0){for(int i=0;i<26;++i)nxt[i]=NULL;}
}*d;
char s[40];
void ins(char* s){
++d->cnt;
node *now=d;
for(int i=0;s[i];++i){
int v=s[i]-'a';
if(now->nxt[v]==NULL)now->nxt[v]=new node;
now=now->nxt[v];
++now->cnt;
}
}
void clear(node* p){
for(int i=0;i<26;++i)
if(p->nxt[i]!=NULL)clear(p->nxt[i]);
delete p;
}
void del(char* s){
node* p=d,*pre=p;
int v;
for(int i=0;s[i];++i){
v=s[i]-'a';
if(p->nxt[v]==NULL)return;
pre=p;
p=p->nxt[v];
}
int num=p->cnt;
clear(p);
pre->nxt[v]=NULL;
p=d;
for(int i=0;;++i){
p=p->nxt[s[i]-'a'];
if(p==NULL)break;
p->cnt-=num;
}
}
bool ask(char* s){
node* p=d;
for(int i=0;s[i];++i){
int v=s[i]-'a';
p=p->nxt[v];
if(p==NULL)return false;
}
if(p->cnt<1)return false;
return true;
}
int main(){
d=new node;
int n;
scanf("%d",&n);
while(n--){
scanf("%s",s);
if(s[0]=='i'){
scanf("%s",s);
ins(s);
}else
if(s[0]=='d'){
scanf("%s",s);
del(s);
}else{
scanf("%s",s);
if(ask(s))puts("Yes");else
puts("No");
}
}
return 0;
}
[HDU5687]2016"百度之星" - 资格赛 Problem C的更多相关文章
- HDU 5688:2016"百度之星" - 资格赛 Problem D
原文链接:https://www.dreamwings.cn/hdu5688/2650.html Problem D Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 5686:2016"百度之星" - 资格赛 Problem B
原文链接:https://www.dreamwings.cn/hdu5686/2645.html Problem B Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 5685:2016"百度之星" - 资格赛 Problem A
原文链接:https://www.dreamwings.cn/hdu5685/2637.html Problem A Time Limit: 2000/1000 MS (Java/Others) ...
- [HDU5686]2016"百度之星" - 资格赛 Problem B
题目大意:给你n,规定一个串中相邻的两个1可以合并为一个2(别的不行),让你求长度为n的全1串最多能变成多少种不同的串. 解题思路:我们先来找一波规律,发现n=1,2,3,4,5时答案分别为1,2,3 ...
- [HDU5688]2016"百度之星" - 资格赛 Problem D
题目大意:给你n个字符串,如果一个字符串可以通过重新排列变成另一个字符串,则认为这两个字符串相等.每输入一个字符串,输出这个字符串和与它相等的之前出现了几次. 解题思路:我们可以用map保存一个字符串 ...
- [HDU5685]2016"百度之星" - 资格赛 Problem A
题目大意:给你一个字符串,和一些问题,每个问题问你[l,r]子串的哈希值是多少. 哈希值计算方法为:$H(s)=\prod _{i=1} ^{i\leq len(s)}(s_i-28)(mod\ 99 ...
- 2016百度之星资格赛 Problem A(前缀积与求逆元)
题意:给出一个字符串,每次询问给出x和y要求算出从x到y的每个字符的(ASCII 码值-28)的值的积(mod9973). 分析:首先的想法肯定是算出每个位置的前缀积,然后只要F[y]/F[x-1]即 ...
- 2016百度之星资格赛 Problem B(大数+组合数)
题意:度熊面前有一个全是由1构成的字符串,被称为全1序列.你可以合并任意相邻的两个1,从而形成一个新的序列.对于给定的一个全1序列,请计算根据以上方法,可以构成多少种不同的序列.最多200个1. 比如 ...
- 2016百度之星 资格赛ABCDE
看题:http://bestcoder.hdu.edu.cn/contests/contest_show.php?cid=690 交题:http://acm.hdu.edu.cn/search.php ...
随机推荐
- Unity 已下载工程包存放路径
Mac Finder 中 Shift+Command+G输入后回车 ~/Library/Unity/Asset Store-5.x Windows 么有,自己上别的网站查去~
- my.cnf配置样例
[mysql] no-auto-rehash port = socket = /data/mysql/data/mysqld.sock [mysqld] user = mysql port = bas ...
- js获取路径参数对象
/** * 获取页面路径参数值 */ function getParams(key) { var result = {}; var paramStr = encodeURI(window.docume ...
- javaScript(其他引用类型对象)
javascript其他引用类型对象 Global对象(全局)这个对象不存在,无形的对象,无法new一个 其内部定义了一些方法和属性:如下 encodeURI str = www.baidu.com ...
- CefSharp获取页面Html代码的两种方式
CefSharp在NuGet的简介是“The CefSharp Chromium-based browser component”,机翻的意思就是“基于Cefsharp Chromium的浏览器组件” ...
- Ajax原理-重点
Ajax原理 AJAX即“Asynchronous Javascript And XML”,是指一种创建交互式网页应用的网页开发技术.AJAX 是一种用于创建快速动态网页的技术.它可以令开发者只向服务 ...
- 【【henuacm2016级暑期训练】动态规划专题 N】Valid Sets
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 给你一棵树. 让你统计其中子树T的数量. 这个子树T要满足最大值和最小值之差小于等于d 树形DP 可以枚举点root为子树的根. 统 ...
- 高级聚合函数rollup(),cube(),grouping sets()
rollup(),cube(),grouping sets() 上面这几个函数,是对group by分组功能做的功能扩展. a.rollup() 功能:在原结果基础上追加一行总合计记录 ...
- ACCESS-入门思维导图
ACCESS-入门思维导图 链接:http://pan.baidu.com/s/1bozYiNt 密码:5tly 如果有错误,请告知我!
- ORA 12505 Listener does not currently know of SID given in connection descriptor
oracle数据库正常启动后.在本地能够正常訪问,可是远程使用sqldevelop却不能訪问.提示ORA 12505 Listener does not currently know of SID g ...