一个字典树问题--电话号码转化问题(POJ 1002 487-3279)
字典树,又称为单词查找树,Trie树。是一种用于快速检索多叉树的结构。典型应用于统计,排序和保存大量字符串。利用字符串的前缀来减少存储空间,减少无谓的比较,提高查询效率。
字典树根节点不包含任何数据,其余节点仅包含一个字母,并且每个节点包含的字母各不相同。
字典树的查找检索总是始于根节点,先取得对应的首字母,然后根据对应的子树进行继续检索查找,往往给字典树一个结束信息标志,作为所有字符成功读出的结束标志。
下面是一个电话号码格式数字转化的问题。(POJ 1002 487-3279)
Description
电话号码的标准格式是七位十进制数,并在第三、第四位数字之间有一个连接符。电话拨号盘提供了从字母到数字的映射,映射关系如下:
A, B, 和C 映射到 2
D, E, 和F 映射到 3
G, H, 和I 映射到 4
J, K, 和L 映射到 5
M, N, 和O 映射到 6
P, R, 和S 映射到 7
T, U, 和V 映射到 8
W, X, 和Y 映射到 9
Q和Z没有映射到任何数字,连字符不需要拨号,可以任意添加和删除。 TUT-GLOP的标准格式是888-4567,310-GINO的标准格式是310-4466,3-10-10-10的标准格式是310-1010。
如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号)
你的公司正在为本地的公司编写一个电话号码薄。作为质量控制的一部分,你想要检查是否有两个和多个公司拥有相同的电话号码。
Input
Output
No duplicates.
12
4873279
ITS-EASY
888-4567
3-10-10-10
888-GLOP
TUT-GLOP
967-11-11
310-GINO
F101010
888-1200
-4-8-7-3-2-7-9-
487-3279
Sample Output
310-1010 2
487-3279 4
888-4567 3
#include<iostream>using namespace std;typedef struct trietree *Ptree;
struct trietree //字典树
{bool arrive; //单词结束标志int treenum; //单词的个数Ptree next[10]; //字典树的儿子
}node[1000000];
int size; //字典树的规模
bool findsolve; //是否找到重复串的标记
int dispose(char *p); //将字符串转化为整形数字
void addnum(int num); //增加数字串
void newtree(int no); //建新树
void dfs(char phone[9],int m,Ptree p); //深度搜索遍历字典树/*将字符串转化为整形数字 */
int dispose(char *p)
{int num = 0;char *q = p;while(*++p != '\0'); p--; //将字符串指针移向末尾while(p >= q) //从后向前遍历字符串指针{if(*p == '-') //忽略“-”{p--;continue;}num *= 10; //计算字符串对应的数字if(*p >= 'A' && *p <= 'Y')num += (*p - 'A' - (*p > 'Q'))/3 + 2; //将字符转化为数字else if(*p >= '0' && *p <= '9')num += *p - '0';p--;}return num;
}/* 增加数字串 */
void addnum(int num)
{Ptree p = &node[1];int i,k;for (i=0;i<=6;i++) //将7个数字插入{k = num % 10;num /= 10;if (! p -> next[k]) //插入位置不存在,创建该节点{newtree(++size);p->next[k] = &node[size];}p = p->next[k];}p->arrive = true; //到达单词末尾p->treenum++; return;}/* 建新树 */
void newtree(int no)
{int i;node[no].arrive = false;node[no].treenum = 0;for (i=0;i<=9;i++){node[no].next[i] = NULL;}return;
}/* 深度搜索遍历字典树 */
void dfs(char phone[9], int m, Ptree p)
{if (true == p->arrive) //如果节点存在数字{if (p->treenum > 1){for (int i=1;i<=7;i++){if (i == 4){cout<<"-";}cout<<phone[i];}cout<<" "<<p->treenum<<endl;findsolve = true;}return;}for (int i=0;i<=9;i++){if (p->next[i]){phone[m+1] = i + '0';dfs(phone,m+1,p->next[i]);}}return;
}int main()
{int n; //串的个数int i,j; int number; //字符串转化得到数字char phone[9]; char ch[80]; //字符串cin>>n;findsolve = false;size = 1;newtree(1);for (i=1;i<=n;i++){cin>>ch;number = dispose(ch);addnum(number);}dfs(phone,0,&node[1]);if (!findsolve){cout<<"No duplicates."<<endl;}system("pause");return 0;}
一个字典树问题--电话号码转化问题(POJ 1002 487-3279)相关推荐
- 字典树,01字典树,可持续化01字典树(总结+例题)
目录 字典树 01字典树 字典树例题: power oj 2390: 查单词 HDU 1671 Phone List HDU 1004Let the Balloon Rise HDU 1075 Wha ...
- LeetCode第 57 场力扣夜喵双周赛(差分数组、单调栈) and 第 251 场力扣周赛(状态压缩动规,树的序列化,树哈希,字典树)
LeetCode第 57 场力扣夜喵双周赛 离knight勋章越来越近,不过水平没有丝毫涨进 1941. 检查是否所有字符出现次数相同 题目描述 给你一个字符串 s ,如果 s 是一个 好 字符串,请 ...
- Trie(字典树)解析及其在编程竞赛中的典型应用举例
摘要: 本文主要讲解了Trie的基本思想和原理,实现了几种常见的Trie构造方法,着重讲解Trie在编程竞赛中的一些典型应用. 什么是Trie? 如何构建一个Trie? Trie在编程竞赛中的典型应用 ...
- HDU6964 I love counting (字典树+莫队)
题意: 给定一个长度为 nnn 的序列c,qc,qc,q 次询问,每次给出l,r,a,bl,r,a,bl,r,a,b求在[l,r][l,r][l,r]中有多少种不同的值 kkk 满足 k⊕a≤b.k ...
- hdu2482 字典树+spfa
题意: 给你一个地图,地图上有公交站点和路线,问你从起点到终点至少要换多少次公交路线. 思路: 首先上面的题意说的和笼统,没说详细是因为这个题目叙述的很多,描述起来麻烦, 下面 ...
- 原来以为(Trie)字典树很难,后来发现不久这么一回事嘛
字典树 牛逼 什么是字典树 字典树,是一种空间换时间的数据结构,又称Trie树.前缀树,是一种树形结构(字典树是一种数据结构),典型用于统计.排序.和保存大量字符串.所以经常被搜索引擎系统用于文本词频 ...
- HDU - 5394 Trie in Tina Town(回文自动机+字典树)
题目链接:点击查看 题目大意:给出一个字典树,现在需要求出字典树上所有的回文串做出的贡献,为 出现次数*回文串长度,求出这个答案 题目链接:可以直接在字典树上dfs然后维护贡献,不过这就涉及到了回文自 ...
- HDU - 1251 统计难题(字典树)
题目链接:点击查看 题目大意:给出一些单词,后续再给出一些前缀,询问包含此前缀的单词一共有多少个 题目分析:这个题目的数据可能有点水,而且时间给的也很足,给了两秒,而且加上是hdu的,可以用无序map ...
- 字典树(讲解+模版)
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀 ...
最新文章
- CAN协议,系统结构和帧结构
- rsync 一条命令实现远程文件传输
- Saving James Bond - Easy Version 原创 2017年11月23日 13:07:33
- 常用api查询网站记录
- cyyz: Day 6 平衡树整理
- msgpack使用 php_如何使用msgpack进行读写?
- 可行性研究报告——机房收费系统
- MATLAB解微分方程组
- Python注释符号(多行注释和单行注释)用法详解
- java 值传递 引用传递的理解 言简意赅 一字千金
- 高频信号发生器设计—电感三点式振荡电路
- 前端遮罩层实现_前端制作遮罩与蒙版
- SSH-免密码互相远程登录
- python 动画场景_clarisse电影级CG场景渲染中文教学
- Mysql给一个大表加一列_MySQL 大表添加一列的实现
- 利用百度地图API接口自制地图
- html5 plus 支付,h5+ app 第三方支付调用步骤
- 宽依赖和窄依赖_Spark宽依赖和窄依赖深度剖析
- Pytorch安装(Anaconda配置虚拟环境)(cpu版)
- Nginx 无法重启报错 Starting nginx