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 (字典树好题)
背景:为了方便九宫格手机用户发短信,希望在用户按键时,根据提供的字典(给出字符串和频数),给出各个阶段最有可能要打的单词. 题意: 首先给出的是字典,每个单词有一个出现频率.然后给出的是询问,每个询问 ...
随机推荐
- TensorFlow学习笔记之--[compute_gradients和apply_gradients原理浅析]
I optimizer.minimize(loss, var_list) 我们都知道,TensorFlow为我们提供了丰富的优化函数,例如GradientDescentOptimizer.这个方法会自 ...
- python numpy 三行代码打乱训练数据
今天发现一个用 numpy 随机化数组的技巧. 需求 我有两个数组( ndarray ):train_datasets 和 train_labels.其中,train_datasets 的每一行和 t ...
- 手写代码注意点--java.lang.Math 相关
1-如果用到了Math的函数,需要手动写上: import java.lang.Math; 2-求x的y次方,用的是Math.pow(x,y); 注意,返回值是double!!! 不是int, 如果需 ...
- SpringBoot2.0+ DataSourceInitializer不生效的问题
1.在url后声明时区 2.更换mysql6.0+的驱动 3.配置属性initialization-mode 为 always 我就是这样解决问题的,如果没解决的话,请在留言处指出错误.谢谢
- Linker Scripts3--MEMORY Command
1.前言 链接器的默认配置允许所有有效内存的分配,你可以使用MEMORY命令来重新定义它 2.MEMORY命令 MEMORY命令描述了一个内存块的位置和大小.你可以用它来描述哪块内存区域可以被链接器使 ...
- Linux kernel学习-内存管理【转】
转自:https://zohead.com/archives/linux-kernel-learning-memory-management/ 本文同步自(如浏览不正常请点击跳转):https://z ...
- windowns下excel2013快速生成月报表
作者:邓聪聪 windowns下excel快速生成月报表,省去了手工复制繁琐的过程 Sub AutoCopySheets() Dim i, j As Integer i = 1 j = 11 For ...
- cryptsetup文件系统加密
今天做了SYC攻防题的文件系统挂载部分,在找到挂载最内层的final文件时发现mount无法识别,这也许就是一个加密的文件系统吧,还好-在龟速的 网络环境下查阅到了losetup循环挂载系统命令,但是 ...
- ACL认证 vs 密码认证
呼入时需要进行认证:acl IP认证 和 密码认证. acl 认证优先进行. ACL认证成功: Access Granted. 直接进入 sip_profile>context 进行路由 A ...
- U盘被写保护不能重新格式化
今天一个朋友拿给我一个U盘,说这个U盘是商家送的,他想格式化,但是U盘被写保护了,系统不能格式化. 他想把这个U盘插到车子里听音乐,但是车载系统始终识别的是第一个分区,而这个分区正是被写保护那个,且这 ...