2016"百度之星" - 资格赛(Astar Round1)C

Problem Description

度熊手上有一本神奇的字典,你可以在它里面做如下三个操作:

1、insert : 往神奇字典中插入一个单词

2、delete: 在神奇字典中删除所有前缀等于给定字符串的单词

3、search: 查询是否在神奇字典中有一个字符串的前缀等于给定的字符串

Input

这里仅有一组测试数据。第一行输入一个正整数N (1\leq N\leq 100000)N(1≤N≤100000),代表度熊对于字典的操作次数,接下来NN行,每行包含两个字符串,中间中用空格隔开。第一个字符串代表了相关的操作(包括: insert, delete 或者 search)。第二个字符串代表了相关操作后指定的那个字符串,第二个字符串的长度不会超过30。第二个字符串仅由小写字母组成。

Output

对于每一个search 操作,如果在度熊的字典中存在给定的字符串为前缀的单词,则输出Yes 否则输出 No。

Sample Input

5
insert hello
insert hehe
search h
delete he
search hello

Sample Output

Copy

Yes
No字典树的操作~模版自己加了删除语句
  1 #include<stdio.h>
  2 //#include<bits/stdc++.h>
  3 #include<string.h>
  4 #include<iostream>
  5 #include<math.h>
  6 #include<sstream>
  7 #include<set>
  8 #include<queue>
  9 #include<map>
 10 #include<vector>
 11 #include<algorithm>
 12 #include<limits.h>
 13 #define inf 0x7fffffff
 14 #define INFL 0x7fffffffffffffff
 15 #define lson l,m,rt<<1
 16 #define rson m+1,r,rt<<1|1
 17 #define LL long long
 18 #define ULL unsigned long long
 19 using namespace std;
 20
 21 typedef struct Trie{
 22     int v;
 23     Trie *next[26];
 24 }Trie;
 25 Trie root;
 26 void createTrie(char *str)
 27 {
 28     int len = strlen(str);
 29     Trie *p = &root, *q;
 30     for(int i=0; i<len; ++i)
 31     {
 32         int id = str[i]-‘a‘;
 33         if(p->next[id] == NULL)
 34         {
 35             q = (Trie *)malloc(sizeof(root));
 36             q->v = 1;
 37             for(int j=0; j<26; ++j)
 38                 q->next[j] = NULL;
 39             p->next[id] = q;
 40             p = p->next[id];
 41         }
 42         else
 43         {
 44             p->next[id]->v++;
 45             p = p->next[id];
 46         }
 47     }
 48 }
 49
 50 int findTrie(char *str)
 51 {
 52     int len = strlen(str);
 53     Trie *p = &root;
 54     for(int i=0; i<len; ++i)
 55     {
 56         int id = str[i]-‘a‘;
 57         p = p->next[id];
 58         if(p == NULL)
 59             return 0;
 60     }
 61     return p->v;
 62 }
 63 void dele(char *str,int n)
 64 {
 65     Trie *p = &root;
 66     int len = strlen(str);
 67     for(int i=0; i<len; ++i)
 68     {
 69         int id = str[i]-‘a‘;
 70         p = p->next[id];
 71         p->v-=n;
 72     }
 73     for(int j=0; j<26; ++j)
 74     {
 75          p->next[j] = NULL;
 76     }
 77 }
 78 int main()
 79 {
 80     int t;
 81     char s1[10000],s2[10000];
 82     for(int i=0;i<26;i++)
 83     {
 84         root.next[i]=NULL;
 85     }
 86     cin>>t;
 87     while(t--)
 88     {
 89         scanf("%s%s",s1,s2);
 90         if(s1[0]==‘i‘)
 91         {
 92             createTrie(s2);
 93         }
 94         else if(s1[0]==‘s‘)
 95         {
 96             int ans=findTrie(s2);
 97             if(ans)
 98             {
 99                 puts("Yes");
100             }
101             else
102             {
103                 puts("No");
104             }
105         }
106         else
107         {
108             int cnt=findTrie(s2);
109             if(cnt)
110             {
111                 dele(s2,cnt);
112             }
113         }
114     }
115     return 0;
116 }
时间: 2024-11-05 19:59:22

2016"百度之星" - 资格赛(Astar Round1)C的相关文章

2016&quot;百度之星&quot; - 资格赛(Astar Round1)-(模拟+线段树+乘法逆元)

Problem A Accepts: 1351 Submissions: 9951 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串.现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串的哈希值.一个字符串的哈希值,由以下公式计算得到: H

2016&quot;百度之星&quot; - 资格赛(Astar Round1) Problem D 简单题

Problem D Accepts: 1527 Submissions: 4307 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 度熊所居住的 D 国,是一个完全尊重人权的国度.以至于这个国家的所有人命名自己的名字都非常奇怪.一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的每一个字符串,也都是这个人的名字.例如,如果一个人名字

hdu 5685 Problem A(2016&quot;百度之星&quot; - 资格赛(Astar Round1)——线段树)

题目链接:acm.hdu.edu.cn/showproblem.php?pid=5685 Problem A Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 564    Accepted Submission(s): 236 Problem Description 度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长

2016&quot;百度之星&quot; - 资格赛 解题报告

这次的百度之星,不得不吐槽下系统的判题数据,被坑了不知多少次. 第一题:大意:求一段区间的累乘.用线段树即可.坑点:如果询问范围超出边界,输出上一次的结果. /* Problem : Status : By wf, */ #include "algorithm" #include "iostream" #include "cstring" #include "cstdio" #include "string"

Problem A(逆元) 2016&quot;百度之星&quot; - 资格赛(Astar Round1)

Problem A Accepts: 1515 Submissions: 10832 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Description 度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串.现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串的哈希值.一个字符串的哈希值,由以下公式计算得到:

2016&quot;百度之星&quot; - 资格赛(Astar Round1)

http://acm.hdu.edu.cn/showproblem.php?pid=5685 #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 1e5 + 5; int H[MAXN]; char Hstr[MAXN]; int N, l, r; const int mods = 9973; typedef long long L

Problem C (字典树的查找删除和插入)2016&quot;百度之星&quot; - 资格赛(Astar Round1)

Problem C Accepts: 630 Submissions: 5255 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem Description 度熊手上有一本神奇的字典,你可以在它里面做如下三个操作: 1.insert : 往神奇字典中插入一个单词 2.delete: 在神奇字典中删除所有前缀等于给定字符串的单词 3.search: 查询是否在神奇字典中

2016&quot;百度之星&quot; - 资格赛(Astar Round1) Problem C (Trie树)

题意:对单词根据前缀进行插入,插入,和查询操作,查询的话存在即可. 因为之前几乎没怎么做过类似的题,再加上这次做的时候,对题意理解的不到位,所以错了很多次,以后要先把题意理解透彻再敲代码,这样会避开之后修改的很多不必要的细节错误. 思路:Trie树,root根节点通过next指针数组连接着26个相同的结点,分别代表26个英文字母,对应着第一个字母,同理,之后的字母也这么建立.这样树形结构就出来了.结构体里的num为记录以当前字符串为前缀的单词的数目. (1)insertNode:插入单词,如果之

2016&quot;百度之星&quot; - 资格赛(Astar Round1) ProblemA (逆元)

题意:求字符串上一段子串的个元素对应值的乘积. 思路:使用前缀数组d存储从头到当前位置元素的乘积的取模之后的值.而直接使用d[b]/d[a - 1]的话,显然是不可行的,有一个逆元模板,就用上了,虽然没明白,先贴上吧,留着以后看- -. Problem Description 度熊手上有一本字典存储了大量的单词,有一次,他把所有单词组成了一个很长很长的字符串.现在麻烦来了,他忘记了原来的字符串都是什么,神奇的是他竟然记得原来那些字符串的哈希值.一个字符串的哈希值,由以下公式计算得到: H(s)=

2016&quot;百度之星&quot; - 资格赛(Astar Round1)D

Problem Description 度熊所居住的 D 国,是一个完全尊重人权的国度.以至于这个国家的所有人命名自己的名字都非常奇怪.一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的每一个字符串,也都是这个人的名字.例如,如果一个人名字是 ACM,那么 AMC, CAM, MAC, MCA, 等也都是这个人的名字.在这个国家中,没有两个名字相同的人. 度熊想统计这个国家的人口数量,请帮助度熊设计一个程序,用来统计每一个人在之前被统计过多少次. Input 这里包括一组测试数据,