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. [转]python3字符串与文本处理

    转自:python3字符串与文本处理 阅读目录 1.针对任意多的分隔符拆分字符串 2.在字符串的开头或结尾处做文本匹配 3.利用shell通配符做字符串匹配 4.文本模式的匹配和查找 5.查找和替换文 ...

  2. 【转】python 内置函数总结(大部分)

    [转]python 内置函数总结(大部分) python 内置函数大讲堂 python全栈开发,内置函数 1. 内置函数 python的内置函数截止到python版本3.6.2,现在python一共为 ...

  3. 谈谈asp,php,jsp的优缺点

    谈谈asp,php,jsp的优缺点   http://hi.baidu.com/lhyboy/item/f95bac264c38830d72863e41 asp.php.asp.net.jsp等主流网 ...

  4. js模板引擎-art-template常用总结(转)

    原文:https://www.cnblogs.com/shiyou00/p/6841801.html art-template javascript 模板引擎,官网:https://github.co ...

  5. hibernate框架学习之多表查询helloworld

    package cn.itcast.h3.hql; import java.util.List; import org.hibernate.Query; import org.hibernate.Se ...

  6. 重新配置ocr voting

    由于存储空间不足,下线的数据库需要把存储空间腾出来,关闭集群资源,主机工程师收回lun需要(包括ocr 和 voting data 磁盘组),新的应用需要上线需要新的数据库,新的hitach存储到位需 ...

  7. Laravel 自定义分页、可以调整、显示数目

    {{-- 增加输入框,跳转任意页码和显示任意条数 --}} <ul class="pagination pagination-sm"> <li> <s ...

  8. Expm 10_2 实现Ford-Fulkerson算法,求出给定图中从源点s到汇点t的最大流,并输出最小割。

    package org.xiu68.exp.exp10; import java.util.ArrayDeque; import java.util.ArrayList; import java.ut ...

  9. reportNG定制化之失败截图及日志

    先从github上拉下 reportNg的源代码 reportng  拉下源码后我们使用IDEA进行导入 1.reportng.properties 增加部分类表项 这里我们直接在末尾添加 log=L ...

  10. [C][代码实例]交换指向常量的二级指针的位置

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> ...