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映射)的更多相关文章

  1. I: Carryon的字符串排序(字典树/map映射)

    2297: Carryon的字符串 Time Limit: C/C++ 1 s      Java/Python 3 s      Memory Limit: 128 MB      Accepted ...

  2. POJ 2001 Shortest Prefixes(字典树)

    题目地址:POJ 2001 考察的字典树,利用的是建树时将每个点仅仅要走过就累加.最后从根节点開始遍历,当遍历到仅仅有1次走过的时候,就说明这个地方是最短的独立前缀.然后记录下长度,输出就可以. 代码 ...

  3. poj 1204 Word Puzzles(字典树)

    题目链接:http://poj.org/problem?id=1204 思路分析:由于题目数据较弱,使用暴力搜索:对于所有查找的单词建立一棵字典树,在图中的每个坐标,往8个方向搜索查找即可: 需要注意 ...

  4. ACM学习历程—HDU 4287 Intelligent IME(字典树 || map)

    Description We all use cell phone today. And we must be familiar with the intelligent English input ...

  5. poj 2513 连接火柴 字典树+欧拉通路 好题

    Colored Sticks Time Limit: 5000MS   Memory Limit: 128000K Total Submissions: 27134   Accepted: 7186 ...

  6. poj 1056 IMMEDIATE DECODABILITY 字典树

    题目链接:http://poj.org/problem?id=1056 思路: 字典树的简单应用,就是判断当前所有的单词中有木有一个是另一个的前缀,直接套用模板再在Tire定义中加一个bool类型的变 ...

  7. POJ 2408 - Anagram Groups - [字典树]

    题目链接:http://poj.org/problem?id=2408 World-renowned Prof. A. N. Agram's current research deals with l ...

  8. POJ 1816 - Wild Words - [字典树+DFS]

    题目链接: http://poj.org/problem?id=1816 http://bailian.openjudge.cn/practice/1816?lang=en_US Time Limit ...

  9. POJ 1451 T9 (字典树好题)

    背景:为了方便九宫格手机用户发短信,希望在用户按键时,根据提供的字典(给出字符串和频数),给出各个阶段最有可能要打的单词. 题意: 首先给出的是字典,每个单词有一个出现频率.然后给出的是询问,每个询问 ...

随机推荐

  1. 2017-2018-2 20165231 实验四 Android程序设计

    实验报告封面 课程:Java程序设计 班级:1652班 姓名:王杨鸿永 学号:20165231 指导教师:娄嘉鹏 实验日期:2018年5月14日 实验时间:15:25 - 17:15 实验序号:实验四 ...

  2. canvas贪吃蛇游戏

    用canvas做了一个贪吃蛇小游戏 开始界面 游戏界面 结束界面 <!DOCTYPE html>  <html>  <head>  <meta charset ...

  3. Web从入门到放弃<1>

    HTML大法: <01> <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  4. JavaScript-client、offset、scroll、定时器

    client offset scroll client.offset.scroll系列 他们的作用主要与计算盒模型,盒子的偏移量和滚动有关 clientTop 内容区域到边框顶部的距离, 说白了, 就 ...

  5. dubbo的本地存根(Stub)

    dubbo的本地存根的原理是:远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,那么就在服务消费者这一端提供了一个Stub类,然后当消费者调用provid ...

  6. windowns下excel2013快速生成月报表

    作者:邓聪聪 windowns下excel快速生成月报表,省去了手工复制繁琐的过程 Sub AutoCopySheets() Dim i, j As Integer i = 1 j = 11 For ...

  7. 范数(norm) 几种范数的简单介绍

    原文地址:https://blog.csdn.net/a493823882/article/details/80569888 我们知道距离的定义是一个宽泛的概念,只要满足非负.自反.三角不等式就可以称 ...

  8. Java链接DB2的4种基本类型【转】

    原文链接:http://doc.chinaunix.net/java/201002/776480.shtml 第一种:目前IBM一直都没有提供 TYPE 1的JDBC驱动程序. 第二种:类型2驱动:C ...

  9. 021_supervise进行管理利器

    一.公司的类似ansible的工具也是用supervise管理的 [admin@mjyall-test-1 /service/ansible-oc-agent]$ ps -ef|grep 19070 ...

  10. 转载:UML学习(四)-----状态图(silent)

    原文:http://www.cnblogs.com/silent2012/archive/2011/11/01/2178278.html 状态图主要用于描述对象具有的各种状态.状态之间的转换过程以及触 ...