思路:一次排序,一次推移,分步实现
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define MAXN 100000
char dir[MAXN+10][10];
char line[1000];
//数组实现巧妙转换
char one[]="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char two[]="2223334445556667N77888999N";
char change(char ch)
{
int left,right;
left=0;
right=25;
//if(right<left)//插入元素为第一个时需要放到while之前进行判断。
//折半查找,如果循环中结束,则必须是left<=right
while(left<=right)
{
int mid=(left+right)/2;
if(ch>one[mid])
left=mid+1;
else if(ch<one[mid])
right=mid-1;
else
return two[mid];
}
return 'N';
}
int cmp(const void *a,const void *b)
{
return strcmp((char *)a,(char *)b);
}
int main()
{
/*提交时候记着加注释
freopen("755.in","r",stdin);
freopen("755.out","w",stdout);
//*/
int m;
scanf("%d",&m);
for(int cas=1;cas<=m;cas++)
{
int n;
memset(dir,0,sizeof(dir));
scanf("%d\n",&n);
for(int i=0;i<n;i++)
{
scanf("%s",line);
int u=0;
for(int k=0;k<strlen(line);k++)
{
if(u==3)
{
dir[i][u++]='-';
k--;
}
else
{
if(isdigit(line[k]))
dir[i][u++]=line[k];
else if(isupper(line[k]) && line[k]!='Q' && line[k]!='Z')
dir[i][u++]=change(line[k]);
}
}
}
qsort(dir,n,sizeof(dir[0]),cmp);
int num=1;
int flag=0,i;
//这里为n时可以将最后一次判断包含进去
for(i=0;i<n;i++)
{
if(strcmp(dir[i],dir[i+1])==0)
num++;
else
{
if(num>1)
{
printf("%s %d\n",dir[i],num);
flag=1;
}
num=1;
}
}
if(flag==0)//细节处理
printf("No duplicates.\n");
if(cas!=m)//细节处理
printf("\n");
}
return 0;
}