华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1229|回复: 3
打印 上一主题 下一主题

P2037 电话号码

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-7-15 13:35:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P2037

题目描述
一串由长长的数字组成的电话号码通常很难记忆。为了方便记忆,有种方法是用单词来方便记忆。例如用“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。
回复

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
沙发
 楼主| 发表于 2019-3-17 17:37:26 | 只看该作者
此题用来训练基本的编程非常的经典。可以使用stl中的map来做
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
板凳
 楼主| 发表于 2019-3-29 16:17:31 | 只看该作者
  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. const int mm=110000;
  5. string s[mm];
  6. int N,i,c,maxc;
  7. string t;
  8. ///非常巧妙   ABCDEFGHIJKLMNOPQRSTUVWXYZ
  9. char tzb[30]="22233344455566670778889990";
  10. string init(string tel)
  11. {
  12.     int l=tel.size();
  13.     string t="";
  14.     char ch;
  15.     for (int i=0; i<=l-1; i++)
  16.     {
  17.         if (tel[i]<='Z' && tel[i]>='A') ch=tzb[tel[i]-'A'];
  18.         else if (tel[i]<='9' && tel[i]>='0') ch=tel[i];
  19.         t=t+ch;
  20.     }
  21.     return t.substr(0,3)+"-"+t.substr(3,4);  ///顺便格式化成输出的样子
  22. }
  23. int main()
  24. {
  25.     cin>>N;
  26.     for (int i=1; i<=N; i++)
  27.     {
  28.         cin>>s[i];
  29.         s[i]=init(s[i]);
  30.     }
  31.     sort(s+1,s+N+1); ///排序,这样相同的就在一起了

  32.     ///for (i=1; i<=N; i++) cout<<s[i]<<endl;
  33.     string t=s[1];
  34.     s[N+1]="0"; ///假的岗哨
  35.     c=maxc=1;
  36.     for (int i=2; i<=N+1; i++)
  37.     {
  38.         if (s[i]==t)
  39.         {
  40.             c++;
  41.             if (c>maxc) maxc=c;
  42.         }
  43.         else
  44.         {
  45.             if (c>1)cout<<t<<' '<<c<<endl;
  46.             c=1;
  47.             t=s[i];
  48.         }
  49.     }
  50.     if (maxc==1) cout<<"No duplicates.";

  51. }
  52. /*
  53. 3
  54. TUT-GLOP
  55. 3-10-10-10
  56. 310-1010
  57. */
复制代码



回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
地板
 楼主| 发表于 2019-3-29 18:05:33 | 只看该作者
很训练编程者的细致能力。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 14:17 , Processed in 0.096037 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表