字典树,又称为单词查找树,Trie树。是一种用于快速检索多叉树的结构。典型应用于统计,排序和保存大量字符串。利用字符串的前缀来减少存储空间,减少无谓的比较,提高查询效率。

字典树根节点不包含任何数据,其余节点仅包含一个字母,并且每个节点包含的字母各不相同。

字典树的查找检索总是始于根节点,先取得对应的首字母,然后根据对应的子树进行继续检索查找,往往给字典树一个结束信息标志,作为所有字符成功读出的结束标志。

下面是一个电话号码格式数字转化的问题。(POJ 1002 487-3279)

Description

企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语。例如,你需要给滑铁卢大学打电话时,可以拨打TUT-GLOP。有时,只将电话号码中部分数字拼写成单词。当你晚上回到酒店,可以通过拨打310-GINO来向Gino's订一份pizza。让电话号码容易被记住的另一个办法是以一种好记的方式对号码的数字进行分组。通过拨打必胜客的“三个十”号码3-10-10-10,你可以从他们那里订pizza。

电话号码的标准格式是七位十进制数,并在第三、第四位数字之间有一个连接符。电话拨号盘提供了从字母到数字的映射,映射关系如下: 
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

输入的格式是,第一行是一个正整数,指定电话号码薄中号码的数量(最多100000)。余下的每行是一个电话号码。每个电话号码由数字,大写字母(除了Q和Z)以及连接符组成。每个电话号码中只会刚好有7个数字或者字母。

Output

对于每个出现重复的号码产生一行输出,输出是号码的标准格式紧跟一个空格然后是它的重复次数。如果存在多个重复的号码,则按照号码的字典升序输出。如果输入数据中没有重复的号码,输出一行: 
No duplicates. 
Sample Input

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)相关推荐

  1. 字典树,01字典树,可持续化01字典树(总结+例题)

    目录 字典树 01字典树 字典树例题: power oj 2390: 查单词 HDU 1671 Phone List HDU 1004Let the Balloon Rise HDU 1075 Wha ...

  2. LeetCode第 57 场力扣夜喵双周赛(差分数组、单调栈) and 第 251 场力扣周赛(状态压缩动规,树的序列化,树哈希,字典树)

    LeetCode第 57 场力扣夜喵双周赛 离knight勋章越来越近,不过水平没有丝毫涨进 1941. 检查是否所有字符出现次数相同 题目描述 给你一个字符串 s ,如果 s 是一个 好 字符串,请 ...

  3. Trie(字典树)解析及其在编程竞赛中的典型应用举例

    摘要: 本文主要讲解了Trie的基本思想和原理,实现了几种常见的Trie构造方法,着重讲解Trie在编程竞赛中的一些典型应用. 什么是Trie? 如何构建一个Trie? Trie在编程竞赛中的典型应用 ...

  4. 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 ...

  5. hdu2482 字典树+spfa

    题意:       给你一个地图,地图上有公交站点和路线,问你从起点到终点至少要换多少次公交路线. 思路:       首先上面的题意说的和笼统,没说详细是因为这个题目叙述的很多,描述起来麻烦, 下面 ...

  6. 原来以为(Trie)字典树很难,后来发现不久这么一回事嘛

    字典树 牛逼 什么是字典树 字典树,是一种空间换时间的数据结构,又称Trie树.前缀树,是一种树形结构(字典树是一种数据结构),典型用于统计.排序.和保存大量字符串.所以经常被搜索引擎系统用于文本词频 ...

  7. HDU - 5394 Trie in Tina Town(回文自动机+字典树)

    题目链接:点击查看 题目大意:给出一个字典树,现在需要求出字典树上所有的回文串做出的贡献,为 出现次数*回文串长度,求出这个答案 题目链接:可以直接在字典树上dfs然后维护贡献,不过这就涉及到了回文自 ...

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

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

  9. 字典树(讲解+模版)

    又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利用字符串的公共前缀 ...

最新文章

  1. CAN协议,系统结构和帧结构
  2. rsync 一条命令实现远程文件传输
  3. Saving James Bond - Easy Version 原创 2017年11月23日 13:07:33
  4. 常用api查询网站记录
  5. cyyz: Day 6 平衡树整理
  6. msgpack使用 php_如何使用msgpack进行读写?
  7. 可行性研究报告——机房收费系统
  8. MATLAB解微分方程组
  9. Python注释符号(多行注释和单行注释)用法详解
  10. java 值传递 引用传递的理解 言简意赅 一字千金
  11. 高频信号发生器设计—电感三点式振荡电路
  12. 前端遮罩层实现_前端制作遮罩与蒙版
  13. SSH-免密码互相远程登录
  14. python 动画场景_clarisse电影级CG场景渲染中文教学
  15. Mysql给一个大表加一列_MySQL 大表添加一列的实现
  16. 利用百度地图API接口自制地图
  17. html5 plus 支付,h5+ app 第三方支付调用步骤
  18. 宽依赖和窄依赖_Spark宽依赖和窄依赖深度剖析
  19. Pytorch安装(Anaconda配置虚拟环境)(cpu版)
  20. Nginx 无法重启报错 Starting nginx

热门文章

  1. 前端接收bolb格式下载文件,前端下载blob格式的文件
  2. Excel数据导入到hbase实战
  3. EdgeX 树莓派实践部署
  4. 如何从 Java 的 List 中删除第一个元素
  5. 这几道SQL面试题秒杀大部分的0年工作经验的毕业生
  6. vasp测试计算机,vasp-test测试例子
  7. 京东妙手如何修改卖点图,批量修改素材教程
  8. Transaction rollback
  9. WPF Aero Glass Window
  10. #STC8A8K# #STC8F1K# #STC8G1K# #STC8H1K# ——STC8系列单片机整体评价