755 487--3279(***)

思路:一次排序,一次推移,分步实现
 
 
#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;
}


你可能感兴趣的:(755 487--3279(***))