传送门:hdu 5687 Problem C
中文题目就不做过多的解释

解题思路

定义一个结构体,里面有26个字母,就像下面这样:

struct Node{int next[26];int sum;void init(){sum = 0;memset(next,-1,sizeof next);}
};

然后定义一个这个类型root[MAXN]数组,表示到每个单词的编号,比如root[1].next[0] = x,就表示当前节点连接的下一个节点是0通过x到达。
增加函数就不用过多赘述了,因为几本书与模板类型。
查询函数建议返回的是查询单词字母一个出现了多少个,因为这样会方便删除操作
删除函数就是将这个单词对应的路上删除对应的数量

AC代码

#include<cstdio>
#include<cstring>
const int MAXN = 1200500;
int tot = 1;
struct Node{int next[26];int sum;void init(){sum = 0;memset(next,-1,sizeof next);}
};
Node root[MAXN];
void add(char *str)
{int len = strlen(str);int start = 0;for(int i=0;i<len;i++){int id = str[i] - 'a';if(root[start].next[id] == -1){root[start].next[id]=tot++;}start = root[start].next[id];root[start].sum++;}
}
int search(char *str)
{int len = strlen(str);int start = 0;for(int i=0;i<len;i++){int id = str[i] - 'a';if(root[start].next[id] == -1)return 0;start = root[start].next[id];}return root[start].sum;
}
void del(char *str,int cnt)
{int len = strlen(str);int start = 0;if(cnt<0) return ;for(int i=0;i<len;i++){int id = str[i] - 'a';if(root[start].next[id] == -1)return ;root[start].sum-=cnt;start = root[start].next[id];}root[start].sum = 0;for(int i=0;i<26;i++)root[start].next[i] = -1;
}int main()
{int T;char str[10],word[35];scanf("%d",&T);for(int i=0;i<MAXN;i++)root[i].init();while(T--){scanf("%s%s",str,word);if(str[0] == 'i')add(word);else if(str[0] == 's')if(search(word)>0) printf("Yes\n");else printf("No\n");elsedel(word,search(word));}return 0;
}

我同学用动态申请内存的方法AC代码

#include <set>
#include <map>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
#define FIN freopen("in.txt", "r", stdin);
#define FOUT freopen("out.txt", "w", stdout);
#define lson l, mid, cur << 1
#define rson mid + 1, r, cur << 1 | 1
const int INF = 0x3f3f3f3f;
const LL INFLL = 0x3f3f3f3f3f3f3f3fLL;
const int MAXN = 1e2 + 50;
const int MAXM = 1e5 + 50;
const int MOD = 1e9 + 7;struct node
{int v;node* nxt[26];node(){v = 0;memset(nxt, NULL, sizeof(nxt));}
};void trie_insert(node* root, char* word)
{node* now = root;int len = strlen(word);for (int i = 0; i < len; i++){int id = word[i] - 'a';if (now->nxt[id] == NULL)now->nxt[id] = new node();now = now->nxt[id];now->v++;}
}void trie_delete(node* root, char* word)
{node* now = root;int len = strlen(word), del;for (int i = 0; i < len; i++){int id = word[i] - 'a';if (now->nxt[id] == NULL)return;now = now->nxt[id];del = now->v;}now = root;for (int i = 0; i < len; i++){int id = word[i] - 'a';if (now->nxt[id] == NULL)return;if (i == len - 1){free(now->nxt[id]);now->nxt[id] = NULL;return;}now = now->nxt[id];now->v -= del;}
}bool trie_query(node* root, char* word)
{node* now = root;int len = strlen(word);int ans = INF;for (int i = 0; i < len; i++){int id = word[i] - 'a';if (now->nxt[id] == NULL)return false;now = now->nxt[id];}return now->v != 0;
}int main()
{int n;scanf("%d", &n);char op[35], word[35];node* root = new node();while (n--){scanf("%s%s", op, word);if (strcmp(op, "insert") == 0)trie_insert(root, word);else if (strcmp(op, "delete") == 0)trie_delete(root, word);elseprintf("%s\n", trie_query(root, word) ? "Yes" : "No");}return 0;
}

hdu 5687 Problem C 字典树相关推荐

  1. HDU 5687 Problem C 字典树

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

  2. hdu 5687 Problem C trie树

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

  3. [ACM] hdu 1671 Phone List (字典树)

    [ACM] hdu 1671 Phone List (字典树) Phone List Problem Description Given a list of phone numbers, determ ...

  4. HDU 5687 Problem C (字典树)

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

  5. HDU 5536 Chip Factory 字典树+贪心

    给你n个数,a1....an,求(ai+aj)^ak最大的值,i不等于j不等于k 思路:先建字典树,暴力i,j每次删除他们,然后贪心找k,再恢复i,j,每次和答案取较大的,就是答案,有关异或的貌似很多 ...

  6. HDU - 1251 统计难题(字典树)

    题目链接:点击查看 题目大意:给出一些单词,后续再给出一些前缀,询问包含此前缀的单词一共有多少个 题目分析:这个题目的数据可能有点水,而且时间给的也很足,给了两秒,而且加上是hdu的,可以用无序map ...

  7. hdu 1251 统计难题 (字典树入门题)

    1 /******************************************************* 2 题目: 统计难题 (hdu 1251) 3 链接: http://acm.hd ...

  8. 2019 杭电多校 HDU - 6625 three arrays 字典树+贪心

    题目链接:https://cn.vjudge.net/problem/HDU-6625 题意:a和b两个数组n个数,数字任意组合异或,求得到c数组的字典序最小 题解:对于两个数组从高位到低位建立两个字 ...

  9. hdu 5687 Problem C

    点击打开链接 Problem C Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

最新文章

  1. 小程序picker_小程序·云开发实战 - 迷你微博
  2. Arduino可穿戴教程Linux平台下安装Arduino IDE
  3. 如何利用WebScarab绕过JS验证
  4. 从一个工程师到管理员的经验分享
  5. 计算机考试设计会议邀请函,计算机二级常见考点之使用合并技术制作邀请函
  6. sql语句查询优化总结,建议及写法技巧(汇总)
  7. LINUX下载编译Paho-Mqtt-C
  8. KNN(k-nearest neighbor algorithm)--从原理到实现
  9. python 两个nc文件 风场,ECMWF 不同step 的 NC 文件如何合并
  10. 串口服务器gsd文件,PROFIBUS总线通信仪表GSD文件的选择
  11. 马云创业过程中的10次失败(转)
  12. GeForce Experience界面重叠解决办法
  13. UFS Write Booster Feature Overview
  14. matlab植物叶面积,植物叶面积测量方法综述
  15. 如何开发一款游戏?【游戏开发所需技能和开发流程】
  16. Linux下搜狗拼音输入法无法输出中文以及显示界面异常
  17. Brute-Force算法
  18. 通过skia/freetype 解析字体获取fontfamily fontstyle name 支持多语言翻译
  19. 数学建模_使用网络分析法(ANP模型)解决美日欧系车型的选择问题
  20. Python——turtle库绘制菱形的3种方法

热门文章

  1. Django学习笔记2-HTML的相关知识
  2. nodemon 被禁用的解决方案
  3. 【应用】博图SCL语言之抢答器应用
  4. python能在苹果手机上运行吗
  5. 第十一届蓝桥杯python大学组国赛真题
  6. 旧瓶装新酒的抽象工厂
  7. 用Unity实现简单的绳子模拟(一)
  8. solor启动和xpath相关抛异常的解决
  9. ios:NSLog打印日志
  10. 【ESP32】Arduino C语言语法总结