这是一简单的排序,之所以把这道题放上面呢,是因为我在这道题上实在wa太多了,wa了7次,中间找出来
个错误,就是在倒数第一个和倒数第二个相等的情况下我没有输出他们的个数,改正后还是wa,最后我发现原来是每组
数据之间输出一个空行。。。。。坑了我好久,一直以为是每组后面都有空行。。。
放代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//char a[100005];
char a[100005][1000];
char b[100005][1000];
int cmp(const void *a,const void *b)
{
return strcmp((char *)a,(char *)b);
}
int main()
{
int n,t,i,j,lena,k;
scanf("%d",&t);
while(t--)
{
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
scanf("%d",&n);
for(k=0; k<n; k++)
{
scanf("%s",a[k]);
lena = strlen(a[k]);
j=0;
for(i=0;i<lena; i++)
{
if(a[k][i]!='-')
{
if(a[k][i]>='A'&&a[k][i]<='Z')
{
switch (a[k][i])
{
case 'A':
case 'B':
case 'C':b[k][j++]='2';break;
case 'D':
case 'E':
case 'F':b[k][j++]='3'; break;
case 'G':
case 'H':
case 'I':b[k][j++]='4'; break;
case 'J':
case 'K':
case 'L':b[k][j++]='5'; break;
case 'M':
case 'N':
case 'O':b[k][j++]='6'; break;
case 'P':
case 'R':
case 'S':b[k][j++]='7'; break;
case 'T':
case 'U':
case 'V':b[k][j++]='8'; break;
case 'W':
case 'X':
case 'Y':b[k][j++]='9'; break;
}
}
else
b[k][j++]=a[k][i];
}
}
b[k][j]='\0';
// puts("###################");-
//printf("%s\n",b[k]);
}
qsort(b,n,sizeof(b[0]),cmp);
//puts("**********************");
// for(i=0; i<n; i++)
// puts(b[i]);
int sum=1;
int flag=0;
int FLAG=0;
for(k=0; k<n-1; k++)
{
// puts(b[k]);
if(!strcmp(b[k],b[k+1]))
{
sum++;
flag=1;
if(sum==2)
{
for(j=0; b[k][j]!='\0'; j++)
{
printf("%c",b[k][j]);
if(j==2)
printf("-");
}
FLAG=1;
}
if(k+1==n-1)
printf(" %d\n",sum);
//printf("%s ",b[k]);
}
else
{
if(flag)
{
printf(" %d\n",sum);
sum=1;
}
flag=0;
}
}
if(FLAG==0)
puts("No duplicates.");
if(t!=0)
puts("");
}
return 0;
}