题目意思很简单,统计一系列号码串化成标准形式后出现次数大于1的串,并且按字典序输出。
注意可能有 化成标准形式后全部是同一个串的情况。
#include<cstdio>
#include<cstring>
#include<ctype.h>
#include<algorithm>
using namespace std;
int f[]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,8,8,8,9,9,9};
int cmp(const void* a,const void* b)
{
char* _a=(char*) a;
char* _b=(char*) b;
return strcmp(_a,_b);
}
char s1[100010][50],s2[100010][50];
int main()
{
//freopen("a.txt","r",stdin);
int t,n,i,j,k;
char str[256];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
{
k=0;
memset(str,'\0',sizeof(str));
scanf("%s",s1[i]);
int l=strlen(s1[i]);
for(j=0;j<l;j++)
{
if(isalpha(s1[i][j]))
{
int c=s1[i][j]-'A';
if(s1[i][j]>'P') c--;
s1[i][j]=f[c]+'0';
}
if(s1[i][j]!='-')str[k++]=s1[i][j];
}
for(j=k;j>3;j--)
str[j]=str[j-1];
str[3]='-';
//printf("%s\n",str);
strcpy(s2[i],str);
}
qsort(s2,n,sizeof(s2[0]),cmp);
/* for(i=0;i<n;i++)
{
printf("%s\n",s2[i]);
}*/
int s=1,flag=0;
for(i=1;i<n;i++)
{
if(strcmp(s2[i],s2[i-1])==0)
{
s++;
}
else if(s>1)
{
printf("%s %d\n",s2[i-1],s);
flag=1;
s=1;
}
}
if(s>1) {printf("%s %d\n",s2[n-1],s);flag=1;}
if(!flag) printf("No duplicates.\n");
if(t) printf("\n");
}
return 0;
}