HDU 5687 字典树插入查找删除
2016-05-16 23:55
429 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5687
2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解
2016百度之星资格赛C题,直接套用字典树,顺便巩固了一下自己对字典树的理解
#include<stdio.h> #include<string.h> struct node{ int next[27]; int cnt; void init(){ cnt = 0;//计数 memset(next,-1,sizeof(next)); } }; struct node trie[4444444]; int tot = 0;//记录节点数 void insert(char *s){ int cur = 0,len = strlen(s); for(int i = 0;i<len;i++){ int temp = s[i]-'a'; int next = trie[cur].next[temp]; if(next == -1){ next = ++tot; trie[next].init(); trie[cur].next[temp] = next; } cur = next; trie[cur].cnt++; } } int find(char *s){ int cur = 0,len = strlen(s); for(int i = 0;i<len;i++){ int temp = s[i]-'a'; int next = trie[cur].next[temp]; if(next == -1) return 0; cur = next; } return trie[cur].cnt>0;//注意 } void del(char *s){ int cur = 0,late,len = strlen(s); //这里特判一下要删除的字符串是否存在 for(int i=0;i<len;i++){ int tmp=s[i]-'a'; int next=trie[cur].next[tmp]; if(next==-1) return; late = cur; cur=next; } cur = 0; for(int i = 0;i<len;i++){ int temp = s[i]-'a'; int next = trie[cur].next[temp]; late = cur; cur = next; trie[cur].cnt--; } trie[cur].init(); int temp = s[len-1]-'a'; trie[late].next[temp] = -1; } int main(){ int n; scanf("%d",&n); char op[33],s[33]; trie[0].init(); while(n--){ scanf(" %s %s",op,s); if(op[0] == 'i'){ insert(s); }else if(op[0] == 's'){ if(find(s)) puts("Yes"); else puts("No"); }else{ del(s); } } return 0; }
相关文章推荐
- 2006浙大:简单计算器
- httpd
- 企业证书发布笔记
- 密码学的起源与基本概念
- Android多媒体--SoundPool
- HDU 2135 Rolling table(方阵旋转+找规律)
- 城市线程练习题后续
- 关于char 指针变量char *=p;这个语句的输出问题
- bat 命令行
- mysql int,bigint,smallint和tinyint理解
- 君子一诺(爱情故事)
- 基于树莓派raspberry: 移植 2.4寸TFT显示屏以及源码分析
- RecyclerView基本使用方式
- diff和patch命令(1)
- Jersey 2.22.2 官方文档第3章学习笔记
- http协议初体验
- MYSQL基本操作
- sql基础常用函数总结
- 找不到#include "stdafx.h"解决办法
- Handler消息机制分析