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 (字典树好题)
背景:为了方便九宫格手机用户发短信,希望在用户按键时,根据提供的字典(给出字符串和频数),给出各个阶段最有可能要打的单词. 题意: 首先给出的是字典,每个单词有一个出现频率.然后给出的是询问,每个询问 ...
随机推荐
- EasyGui的一个小例子
EasyGui的安装:首先下载easyGui安装包,地址链接:https://pan.baidu.com/s/1D8f_eXWn7l8xhcTuEsqZmA 密码:e5z5 安装步骤: 1.进入eas ...
- pytroch 0.3 到 0.4版本迁移资料mark
搜了一堆,还是官方资料给力,一份中文,一份英文,maek一下 https://www.pytorchtutorial.com/pytorch-0-4-0-migration-guide/ https: ...
- flask 源码剖析
flask 上下文管理源码流程及涉及的部分技术点 [flask源码梳理]之一 偏函数_mro [flask源码梳理]之二 面向对象中__setattr__ [flask源码梳理]之三 Local ...
- Vivado Turtorial 01 —— 使用vivado中debug功能(类似ISE中ChipScope)
1.基于BASYS3板子,有如下代码: module top( input clk, input rst, output test_clk ); parameter DIV_CNT = 2; reg ...
- ethtool 解决网卡丢包严重和网卡原理【转】
转自:https://blog.csdn.net/u011857683/article/details/83758869 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...
- Python3学习笔记33-正则表达式
学习文章传送门 正则表达式是用来匹配字符串的.只要符合规则的字符串.就可以认为匹配了.否则,这个字符串不合法. \d:可以匹配一个数字 ‘00\d’可以匹配001不能匹配00A \w:可以匹配 ...
- 【转】C++标准转换运算符static_cast
static_cast<new_type> (expression) 虽然const_cast是用来去除变量的const限定,但是static_cast却不是用来去除变量的static引用 ...
- ACL认证 vs 密码认证
呼入时需要进行认证:acl IP认证 和 密码认证. acl 认证优先进行. ACL认证成功: Access Granted. 直接进入 sip_profile>context 进行路由 A ...
- CSS集锦
div内容自动换行:word-wrap:break-word;word-break:break-all;
- C/C++中容易造成内存溢出的函数
1.strcpy() strcpy()函数将源字符串复制到缓冲区.没有指定要复制字符的具体数目.复制字符的数目直接取决于源字符串中的数目.如果源字符串碰巧来自用户输入,且没有专门限制其大小,则有可能会 ...