POJ 1002 487-3279(字典树/map映射)
487-3279
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 309257 Accepted: 55224
Description
Businesses like to have memorable telephone numbers. One way to make a telephone number memorable is to have it spell a memorable word or phrase. For example, you can call the University of Waterloo by dialing the memorable TUT-GLOP. Sometimes only part of the number is used to spell a word. When you get back to your hotel tonight you can order a pizza from Gino's by dialing 310-GINO. Another way to make a telephone number memorable is to group the digits in a memorable way. You could order your pizza from Pizza Hut by calling their ``three tens'' number 3-10-10-10.
The standard form of a telephone number is seven decimal digits with a hyphen between the third and fourth digits (e.g. 888-1200). The keypad of a phone supplies the mapping of letters to numbers, as follows:
A, B, and C map to 2
D, E, and F map to 3
G, H, and I map to 4
J, K, and L map to 5
M, N, and O map to 6
P, R, and S map to 7
T, U, and V map to 8
W, X, and Y map to 9
There is no mapping for Q or Z. Hyphens are not dialed, and can be added and removed as necessary. The standard form of TUT-GLOP is 888-4567, the standard form of 310-GINO is 310-4466, and the standard form of 3-10-10-10 is 310-1010.
Two telephone numbers are equivalent if they have the same standard form. (They dial the same number.)
Your company is compiling a directory of telephone numbers from local businesses. As part of the quality control process you want to check that no two (or more) businesses in the directory have the same telephone number.
Input
The input will consist of one case. The first line of the input specifies the number of telephone numbers in the directory (up to 100,000) as a positive integer alone on the line. The remaining lines list the telephone numbers in the directory, with each number alone on a line. Each telephone number consists of a string composed of decimal digits, uppercase letters (excluding Q and Z) and hyphens. Exactly seven of the characters in the string will be digits or letters.
Output
Generate a line of output for each telephone number that appears more than once in any form. The line should give the telephone number in standard form, followed by a space, followed by the number of times the telephone number appears in the directory. Arrange the output lines by telephone number in ascending lexicographical order. If there are no duplicates in the input print the line:
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
题意:按照对应规则将字符串转化为标准格式的电话号码和出现次数,出现次数小于2不输出,无输出则输出No duplicates.
法一:全部转化数字后建字典树,最后一个节点记录次数,建完后dfs遍历到尾结点输出串
#include<iostream>
#include<string.h>
#include<map>
using namespace std;
int vis[222222];
int t[222222][22];
char str[222];
int flag,pos=0;
void insert(char *s)
{
int rt=0;
int len=strlen(s);
for(int i=0;i<len;i++)
{
int x;
if(s[i]=='-')continue;
if(s[i]>='0'&&s[i]<='9')
x=s[i]-'0';
else if(s[i]>='A'&&s[i]<='Z')
{
if(s[i]<'Q')
x=(s[i]-'A')/3+2;
else if(s[i]>'Q')
x=(s[i]-'B')/3+2;
}
if(t[rt][x]==0)
t[rt][x]=++pos;
rt=t[rt][x];
}
vis[rt]++;
}
void dfs(int rt,int deep)
{
for(int i=0;i<=9;i++)
{
if(t[rt][i])
{
if(deep<3)
str[deep]=i+'0';
else
str[3]='-',
str[deep+1]=i+'0';
if(vis[t[rt][i]]>=2)
{
flag=1;
str[deep+2]='\0';
printf("%s %d\n",str,vis[t[rt][i]]);
}
dfs(t[rt][i],deep+1);
}
}
}
int main()
{
int n;
scanf("%d",&n);
memset(vis,0,sizeof(vis));
memset(t,0,sizeof(t));
char ss[222222];
for(int i=0;i<n;i++)
{
scanf("%s",ss),
insert(ss);
}
flag=0;
dfs(0,0);
if(!flag)
printf("No duplicates. \n");
return 0;
}
法二:全部转化为一个数,用map构成映射,筛选map中数量大于二的元素,并输出
#include<iostream>
#include<string.h>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
/*string ss;
void trans(char s[])
{
int len=strlen(s);
ss.clear();
for(int i=0;i<len;i++)
{
if(ss.length()==3)ss+='-';
if(s[i]=='-') continue;
else if(s[i]>='0'&&s[i]<='9')
ss+=s[i];
else if(s[i]>='A'&&s[i]<'Q')
ss+=(s[i]-'A')/3+2+'0';
else if(s[i]>'Q'&&s[i]<'Z')
ss+=(s[i]-'B')/3+2+'0';
}
}1800ms,果断改用下面方法*/
int trans(char *ss)
{
int len=strlen(ss);
int num=0;
for(int i=0;i<len;i++)
{
if(ss[i]=='-') continue;
else if(ss[i]>='0'&&ss[i]<='9')
num=num*10+(ss[i]-'0');
else if(ss[i]>='A'&&ss[i]<'Q')
num=num*10+(ss[i]-'A')/3+2;
else if(ss[i]>'Q'&&ss[i]<'Z')
num=num*10+(ss[i]-'B')/3+2;
}
return num;
}
int main()
{
int n;
scanf("%d",&n);
char s[100];
map<int,int>m;
for(int i=0;i<n;i++)
{
scanf("%s",s);
m[trans(s)]++;
}
int flag=0;
map<int,int>::iterator it;
for(it=m.begin();it!=m.end();it++)
{
if(it->second>=2)
flag=1,//it->first是指mp[key]中的键值(就是key),it->second是指键对应(mp[key])
printf("%03d-%04d %d\n",it->first/10000,it->first%10000,it->second);
}
if(!flag)
printf("No duplicates.\n");
return 0;
}
POJ 1002 487-3279(字典树/map映射)的更多相关文章
- I: Carryon的字符串排序(字典树/map映射)
2297: Carryon的字符串 Time Limit: C/C++ 1 s Java/Python 3 s Memory Limit: 128 MB Accepted ...
- POJ 2001 Shortest Prefixes(字典树)
题目地址:POJ 2001 考察的字典树,利用的是建树时将每个点仅仅要走过就累加.最后从根节点開始遍历,当遍历到仅仅有1次走过的时候,就说明这个地方是最短的独立前缀.然后记录下长度,输出就可以. 代码 ...
- poj 1204 Word Puzzles(字典树)
题目链接:http://poj.org/problem?id=1204 思路分析:由于题目数据较弱,使用暴力搜索:对于所有查找的单词建立一棵字典树,在图中的每个坐标,往8个方向搜索查找即可: 需要注意 ...
- ACM学习历程—HDU 4287 Intelligent IME(字典树 || map)
Description We all use cell phone today. And we must be familiar with the intelligent English input ...
- poj 2513 连接火柴 字典树+欧拉通路 好题
Colored Sticks Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 27134 Accepted: 7186 ...
- poj 1056 IMMEDIATE DECODABILITY 字典树
题目链接:http://poj.org/problem?id=1056 思路: 字典树的简单应用,就是判断当前所有的单词中有木有一个是另一个的前缀,直接套用模板再在Tire定义中加一个bool类型的变 ...
- POJ 2408 - Anagram Groups - [字典树]
题目链接:http://poj.org/problem?id=2408 World-renowned Prof. A. N. Agram's current research deals with l ...
- POJ 1816 - Wild Words - [字典树+DFS]
题目链接: http://poj.org/problem?id=1816 http://bailian.openjudge.cn/practice/1816?lang=en_US Time Limit ...
- POJ 1451 T9 (字典树好题)
背景:为了方便九宫格手机用户发短信,希望在用户按键时,根据提供的字典(给出字符串和频数),给出各个阶段最有可能要打的单词. 题意: 首先给出的是字典,每个单词有一个出现频率.然后给出的是询问,每个询问 ...
随机推荐
- Qemu-KVM管理
内容: 一.KVM基本配置 二.KVM网络的桥接 三.创建虚拟机 四.虚拟机的关闭和启动 关于KVM: 1).KVM是开源软件,全称是kernel-based virtual machine(基于内核 ...
- 20165325 预备作业3 Linux安装及学习
Linux安装及学习 一.VirtualBox和Ubuntu安装 问题一:虚拟机中Ubuntu的版本 在设置虚拟机的操作系统的版本时,我发现我的电脑只能设置32-bit的Ubuntu版本.教程上选用了 ...
- python 获取本机IP的三种方式
python获取本机IP的方式 第一种: #!/usr/bin/python import socket import fcntl import struct def get_ip_address(i ...
- python中模块的__all__属性
python模块中的__all__属性,可用于模块导入时限制,如:from module import *此时被导入模块若定义了__all__属性,则只有__all__内指定的属性.方法.类可被导入. ...
- xv6 + Qemu 在Ubuntu下编译运行教程【转】
转自:https://blog.csdn.net/yinglang19941010/article/details/49310111 如果想要离线看教程,可以下载该 文档 一.使用工具说明 1. ...
- shell中的dd命令使用详解
一.dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 注意:指定数字的地方若以下列字符结尾,则乘以相应的数字:b=512:c=1:k=1024:w=2 参数注释: 1. ...
- MVC 当前上下文中不存在名称“Styles” “Scripts”
它们在程序集System.Web.Optimization下,只要全名引用即可 修改配置 在web项目的Views下的web.config修改如下即可,如果是Areas下,处理方法相同 <sys ...
- 《The Practice and Theory of Bolshevism》的笔记-第114页
章节名:International Policy 页码:第114页 2017-09-30 15:11:24 Among religions, Bolshevism is to be reckoned ...
- atom 的使用插件
emmet # html补全minimap # 源码预览图linter # 语法检查file-icons # 文件图标docblockr # 注释块autoclose-html # 自动闭合html标 ...
- Redis持久化存储(AOF与RDB两种模式)
Redis中数据存储模式有2种:cache-only,persistence; cache-only即只做为“缓存”服务,不持久数据,数据在服务终止后将消失,此模式下也将不存在“数据恢复”的手段,是一 ...