一开始直接用map和string模拟,结果超时,然后转换为整数hash,但输出后前导0没了,完了就在每个数字前多加一位1,但用sort好像也得超时,看网上说要用堆排序,细节挺多的,主要是要减少时间,代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
char t[100];
int key,tel[100005]={0},size=0;
int main()
{
int n;
map<int,int> ntel;
scanf("%d",&n);getchar();
for(int i=1;i<=n;i++){
key=1;
scanf("%s",t);getchar();
int len=strlen(t),mark=0;
for(int i=0;i<len;i++){
if(t[i]=='-') continue;
if(mark==7) break;
mark++;
int tnum;
if(t[i]>='0'&&t[i]<='9') tnum=t[i]-'0';
if(t[i]=='A'||t[i]=='B'||t[i]=='C') tnum=2;
else if(t[i]=='D'||t[i]=='E'||t[i]=='F') tnum=3;
else if(t[i]=='G'||t[i]=='H'||t[i]=='I') tnum=4;
else if(t[i]=='J'||t[i]=='K'||t[i]=='L') tnum=5;
else if(t[i]=='M'||t[i]=='N'||t[i]=='O') tnum=6;
else if(t[i]=='P'||t[i]=='R'||t[i]=='S') tnum=7;
else if(t[i]=='T'||t[i]=='U'||t[i]=='V') tnum=8;
else if(t[i]=='W'||t[i]=='X'||t[i]=='Y') tnum=9;
key=key*10+tnum;
}
if(ntel[key]==0)
tel[size++]=key;
ntel[key]++;
}
make_heap(tel,tel+size);
sort_heap(tel,tel+size);
bool mark=false;
for(int i=0;i<size;i++) if(ntel[tel[i]]>1){
char a[10]={0};
sprintf(a,"%d",tel[i]);
printf("%c%c%c-%c%c%c%c %d\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],ntel[tel[i]]);
mark=true;
}
if(!mark) cout<<"No duplicates."<<endl;
return 0;
}