1.电话号码要用string读入,否则会超时
2.按字典序排列答案时应该有2种方法
(1)把字符转化成为数字数组,直接用sort快排即可
(2)把数字借用trie数的思想(没试过)
3.‘-’的处理可以直接在读入数据时删去,或者将string转化成为char时直接不管(好得多——不易出错)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdlib>
using namespace std;
char map[26]={'2','2','2','3','3','3','4','4','4','5','5','5','6','6','6','7',0,'7','7','8','8','8','9','9','9',0};
char number[30];
string phone[100000];
int n;
int main()
{
freopen("lx.in","r",stdin);
freopen("lx.out","w",stdout);
int pos;
scanf("%d",&n);
for(int i=0;i<n;++i)
{
pos=0;
scanf("%s",number);
for(int j=0;j<strlen(number);++j)
{
if(number[j]=='-') continue;
if(number[j]>='A'&&number[j]<='Z')
number[j]=map[number[j]-'A'];
phone[i]+=number[j];
pos++;
if(pos==3) phone[i]+='-';
}
}
sort(phone,phone+n);
int ti=1;
int ok=0;
for(int i=1;i<n;++i)
{
if(phone[i-1]!=phone[i])
{
if(ti>1)
{
cout<<phone[i-1]<<" "<<ti<<endl;
ok=1;
}
ti=1;
}
else ti++;
}
if(ti>1)
{
cout<<phone[n-1]<<" "<<ti<<endl;
ok=1;
}
if(ok==0) cout<<"No duplicates."<<endl;
return 0;
}