华师一附中OI组
标题:
P2037 电话号码
[打印本页]
作者:
admin
时间:
2018-7-15 13:35
标题:
P2037 电话号码
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。
作者:
admin
时间:
2019-3-17 17:37
此题用来训练基本的编程非常的经典。可以使用stl中的map来做
作者:
admin
时间:
2019-3-29 16:17
#include <iostream>
#include <algorithm>
using namespace std;
const int mm=110000;
string s[mm];
int N,i,c,maxc;
string t;
///非常巧妙 ABCDEFGHIJKLMNOPQRSTUVWXYZ
char tzb[30]="22233344455566670778889990";
string init(string tel)
{
int l=tel.size();
string t="";
char ch;
for (int i=0; i<=l-1; i++)
{
if (tel[i]<='Z' && tel[i]>='A') ch=tzb[tel[i]-'A'];
else if (tel[i]<='9' && tel[i]>='0') ch=tel[i];
t=t+ch;
}
return t.substr(0,3)+"-"+t.substr(3,4); ///顺便格式化成输出的样子
}
int main()
{
cin>>N;
for (int i=1; i<=N; i++)
{
cin>>s[i];
s[i]=init(s[i]);
}
sort(s+1,s+N+1); ///排序,这样相同的就在一起了
///for (i=1; i<=N; i++) cout<<s[i]<<endl;
string t=s[1];
s[N+1]="0"; ///假的岗哨
c=maxc=1;
for (int i=2; i<=N+1; i++)
{
if (s[i]==t)
{
c++;
if (c>maxc) maxc=c;
}
else
{
if (c>1)cout<<t<<' '<<c<<endl;
c=1;
t=s[i];
}
}
if (maxc==1) cout<<"No duplicates.";
}
/*
3
TUT-GLOP
3-10-10-10
310-1010
*/
复制代码
作者:
admin
时间:
2019-3-29 18:05
很训练编程者的细致能力。
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2