题目描述

一串由长长的数字组成的电话号码通常很难记忆。为了方便记忆,有种方法是用单词来方便记忆。例如用“Three Tens”来记忆电话3-10-10-10。

电话号码的标准形式是七位数字,中间用连字号分成前三个和后四个数字(例如:888-1200)。电话号码可以用字母来表示。以下是字母与数字的对应:

A,B和C对应2

D,E和F对应3

G,H和I对应4

J,K和L对应5

M,N和O对应6

P,R和S对应7

T,U和V对应8

W,X和Y对应9

你会发现其中没有字母Q和Z。电话中的连字号是可以忽略。例如TUT-GLOP的标准形式是888-4567,310-GINO的标准形式是310-4466,3-10-10-10的标准形式是310-1010。

如果两个电话号码的标准形式是一样的,那么这两个电话号码就是一样的。

现在有一本电话簿,请从中找出哪些电话号码是重复的。

输入输出格式

输入格式:

第一行一个正整数N,表示有多少个电话号码。

以下N行,每行一个电话号码,电话号码由数字、大写字母(除Q、Z)和连字符组成。电话号码长度不会超过1000。所有电话号码都合法。

输出格式:

将所有重复的电话号码按字典序以标准形式输出,并且在每个电话号码后跟一个整数,表示该电话号码共出现了多少次,电话号码和整数间用一个空格隔开。不要输出多余空行。

如果没有重复的电话号码,则输出:No duplicates.

输入输出样例

输入样例#1: 复制

3
TUT-GLOP
3-10-10-10
310-1010
输出样例#1: 复制

310-1010 2

说明

【数据范围】

对于30%的数据,N<=20。

对于50%的数据,N<=10000。

对于100%的数据,N<=100000。

不用开map

/*用一个map把所有的字母表示的数字存起来,0和1题目中没说,但也要表示。
一个<string,int>类型的map表示a这个字符串出现的次数。
把每个读入的字符串转化为标准形式存起来,如果有出现次数超过两次的,存起来,答案数++。
最后将答案按字典序排序输出。 (如果map的初始化写到了函数里,别忘记调用!!!,一开始没调用,全输出的空格,调了半个多小时)。*/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
using namespace std; int n,cnt,now,pos,sum[];
string s,temp,tot[];
map<char,char> excel;
map<string,int> a;
struct Ans
{
int cs;
string chuan;
}ans[]; void init() //初始化函数
{
excel['']='';excel['']='';
excel['A']=excel['B']=excel['C']=excel['']='';
excel['D']=excel['E']=excel['F']=excel['']='';
excel['G']=excel['H']=excel['I']=excel['']='';
excel['J']=excel['K']=excel['L']=excel['']='';
excel['M']=excel['N']=excel['O']=excel['']='';
excel['P']=excel['R']=excel['S']=excel['']='';
excel['T']=excel['U']=excel['V']=excel['']='';
excel['W']=excel['X']=excel['Y']=excel['']='';
} bool cmp(Ans a,Ans b)
{
return a.chuan+b.chuan<b.chuan+a.chuan;
} int main()
{
init(); //千万千万别忘记调用
scanf("%d",&n);
for(int i=;i<=n;i++)
{
cin>>s;
temp.clear();pos=; //将temp清空,pos归零
for(int j=;j<s.length();j++)
{
if(s[j]!='-') //转化为数字
{
temp+=excel[s[j]];
pos++;
}
if(pos==) temp+='-',pos=-; //到了该加'-'的地方,加上'-',同时将pos设为负值,防止重复添加
}
if(!a[temp]) tot[++cnt]=temp; //如果这个字符串没出现过,将这个字符串加入到已有的字符串中
a[temp]++; //该字符串出现的次数++
}
for(int i=;i<=cnt;i++) //找哪个字符串是重复的
{
if(a[tot[i]]>)
{
ans[++now].chuan=tot[i]; //存答案
ans[now].cs=a[tot[i]];
}
}
if(!now) //没有重复的
{
printf("No duplicates.");
return ;
}
sort(ans+,ans+now+,cmp); //按字典序排列
for(int i=;i<=now;i++)
{
cout<<ans[i].chuan<<' ';
printf("%d\n",ans[i].cs);
}
return ;
}

map TLE一个点

/*用一个map把所有的字母表示的数字存起来,0和1题目中没说,但也要表示。
一个<string,int>类型的map表示a这个字符串出现的次数。
把每个读入的字符串转化为标准形式存起来,如果有出现次数超过两次的,存起来,答案数++。
最后将答案按字典序排序输出。 (如果map的初始化写到了函数里,别忘记调用!!!,一开始调用,全输出的空格,调了半个多小时)。*/ #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
using namespace std; int n,cnt,now,pos,sum[];
string s,temp,tot[];
char excel[];
map<string,int> a;
struct Ans
{
int cs;
string chuan;
}ans[]; void init() //初始化函数
{
excel['']='';excel['']='';
excel['A']=excel['B']=excel['C']=excel['']='';
excel['D']=excel['E']=excel['F']=excel['']='';
excel['G']=excel['H']=excel['I']=excel['']='';
excel['J']=excel['K']=excel['L']=excel['']='';
excel['M']=excel['N']=excel['O']=excel['']='';
excel['P']=excel['R']=excel['S']=excel['']='';
excel['T']=excel['U']=excel['V']=excel['']='';
excel['W']=excel['X']=excel['Y']=excel['']='';
} bool cmp(Ans a,Ans b)
{
return a.chuan+b.chuan<b.chuan+a.chuan;
} int main()
{
init(); //千万千万别忘记调用
scanf("%d",&n);
for(int i=;i<=n;i++)
{
cin>>s;
temp.clear();pos=; //将temp清空,pos归零
for(int j=;j<s.length();j++)
{
if(s[j]!='-') //转化为数字
{
temp+=excel[s[j]];
pos++;
}
if(pos==) temp+='-',pos=-; //到了该加'-'的地方,加上'-',同时将pos设为负值,防止重复添加
}
if(!a[temp]) tot[++cnt]=temp; //如果这个字符串没出现过,将这个字符串加入到已有的字符串中
a[temp]++; //该字符串出现的次数++
}
for(int i=;i<=cnt;i++) //找哪个字符串是重复的
{
if(a[tot[i]]>)
{
ans[++now].chuan=tot[i]; //存答案
ans[now].cs=a[tot[i]];
}
}
if(!now) //没有重复的
{
printf("No duplicates.");
return ;
}
sort(ans+,ans+now+,cmp); //按字典序排列
for(int i=;i<=now;i++)
{
cout<<ans[i].chuan<<' ';
printf("%d\n",ans[i].cs);
}
return ;
}

char数组AC

P2037 电话号码的更多相关文章

  1. 洛谷P2037 电话号码

    P2037 电话号码 题目描述 一串由长长的数字组成的电话号码通常很难记忆.为了方便记忆,有种方法是用单词来方便记忆.例如用“Three Tens”来记忆电话3-10-10-10. 电话号码的标准形式 ...

  2. [LeetCode] Valid Phone Numbers 验证电话号码

    Given a text file file.txt that contains list of phone numbers (one per line), write a one liner bas ...

  3. [LeetCode] Letter Combinations of a Phone Number 电话号码的字母组合

    Given a digit string, return all possible letter combinations that the number could represent. A map ...

  4. 【代码笔记】iOS-替换电话号码中间4位为-号

    一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional se ...

  5. 国内固定电话正则验证:'tel': [/0\d{2,3}-\d{7,8}(|([-\u8f6c]{1}\d{1,5}))$/, "请填写有效的电话号码"],

    // 验证字段 $('#info_form').validator({ rules : { checkMobile : function(ele) { return checkMobile(ele); ...

  6. C#中使用正则表达式验证电话号码、手机号、身份证号、数字和邮编

      验证电话号码的主要代码如下: public bool IsTelephone(string str_telephone) { return System.Text.RegularExpressio ...

  7. 防止在iOS设备中的Safari将数字识别为电话号码

    在测试中发现iPad上的Safari总会把长串数字识别为电话号码,文字变成蓝色,点击还会弹出菜单添加到通讯录. 别的地方倒也罢了,如果在用户名中出现数字(手机注册新浪微博的话用户名就是“手机用户xxx ...

  8. java 验证手机号码、电话号码(包括最新的电信、联通和移动号码)

    一.目前的号码段(2016-12-8更新)   二.代码 package com.test; import java.util.regex.Pattern; public class CheckPho ...

  9. php电话号码正则表达式常用例子

    电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号) 02   03 ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{ ...

随机推荐

  1. [Luogu5320][BJOI2019]堪破神机(DP+斯特林数)

    https://www.cnblogs.com/cjyyb/p/10747543.html 特征方程+斯特林反演化简式子,要注意在模998244353意义下5没有二次剩余,所以每个数都要用$a+b\s ...

  2. Python之特征工程-3

    一.什么是特征工程?其实也是数据处理的一种方式,和前面的原始数据不一样的是,我们在原始数据的基础上面,通过提取有效特征,来预测目标值.而想要更好的去得出结果,包括前面使用的数据处理中数据特征提取,新增 ...

  3. js基本用法

    1. 在HTML里面加入JavaScript 方法非常简单,就是通过一对<script></script>标签,然后在标签里面书写代码即可 2. 标签位置 按照以前传统的方法, ...

  4. Python基础初识

    一.安装 暂时没空写,预留 二.python基础初识 2.1 注释 当行注释:# 被注释内容 多行注释:'''被注释内容''',或者"""被注释内容"" ...

  5. 炫酷的可视化工具包——cufflinks

    前言 学过Python数据分析的朋友都知道,在可视化的工具中,有很多优秀的三方库,比如matplotlib,seaborn,plotly,Boken,pyecharts等等.这些可视化库都有自己的特点 ...

  6. 《你不知道的Javascript》感悟篇—对象属性遍历的那些事

    划重点 本篇笔者将重点介绍JavaScript中 getOwnPropertyNames .Object.keys.for ... in 的使用及他们之间的异同点. getOwnPropertyNam ...

  7. Django一对一查询,列类型及参数

    一对一查询 表的创建 # 通过 OneToOneField 创建一对一的关系 from django.db import models # Create your models here. class ...

  8. jmeter第一次使用

    创建线程组 依次创建后,在http请求页面填入接口地址,参数,头信息,点击运行,然后查看结果树

  9. IPTables 和 Netfilter 框架

    前言 防火墙是保护服务器的重要工具. Linux中最常用的基本防火墙软件是iptables.iptables通过与Linux内核网络堆栈(networking stack)中的包过滤钩子(packet ...

  10. [Golang][Mac]Go 语言学习资料记录

    背景:最近的项目开发语言是GOlang 因此需要做一些简单了解和学习记录 又可以学习一下Google的新语言了,想想有些小激动哦~ 官方网站(需翻墙才能打开,比如用蓝灯)https://golang. ...