题目链接:http://poj.org/problem?id=1002
题意:每个英文字母都有其对应的数字,对于给定的带有英文字母或数字的电话号码,按其出现的次序输出出现次数大于1的所有数字电话号码和其出现的次数。
题解:使用优先队列
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 10000000;
bool vi[maxn];
int cnt[maxn];
int m[256];
priority_queue<int> Q;
int main() {
m['0']=0; m['1']=1;
m['2']=2;m['A']=2;m['B']=2;m['C']=2;
m['3']=3;m['D']=3;m['E']=3;m['F']=3;
m['4']=4;m['G']=4;m['H']=4;m['I']=4;
m['5']=5;m['J']=5;m['K']=5;m['L']=5;
m['6']=6;m['M']=6;m['N']=6;m['O']=6;
m['7']=7;m['P']=7;m['R']=7;m['S']=7;
m['8']=8;m['T']=8;m['U']=8;m['V']=8;
m['9']=9;m['W']=9;m['X']=9;m['Y']=9;
int ans , n;
char ch[100];
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++) {
scanf("%s",ch);
getchar();
ans=0;
int len=strlen(ch);
for(int j=0;j<len;j++)
if(ch[j]!='-' && ch[j]!='Q' && ch[j]!='Z') ans=ans*10+m[ch[j]];
cnt[ans]++;
if(!vi[ans] && cnt[ans]>1){
Q.push(-ans),vi[ans]=1;
}
}
if(Q.empty()) printf("No duplicates.\n");
while(!Q.empty()) {
ans=-Q.top();Q.pop();
sprintf(ch,"%07d",ans);
for(int i=0;i<7;i++)
if(i==2) printf("%c-",ch[i]);
else printf("%c",ch[i]);
printf(" %d\n",cnt[ans]);
}
return 0;
}