古老的密码(Ancient Cipher)

/*
古老的密码
*/ 
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char s1[110],s2[110];//堆里的数组会自动赋0 
int a[26],b[26];
//书上说要用库函数qsort(),(快速排序,这里当然可以用选择排序啊,桶排序啊,等等)
int cmpi(const void *a,const void *b)
{
	return *(int *)a-*(int *)b;
}
//这个函数其实可以不用,因为char是被当成int 处理的
int cmpc(const void *a,const void *b)
{
	return *(char *)a-*(char *)b;
}
int main()
{
	while(scanf("%s",s1)!=EOF)
	{
		scanf("%s",s2);
		int len=strlen(s1);
	
	qsort(s1,len,sizeof(s1[0]),cmpc); 
	qsort(s2,len,sizeof(s2[0]),cmpc);
	
/*	//测试s1,s2
	printf("%s\n%s\n",s1,s2); 
*/
	//桶排序
	for(int i=0;i<len;i++)
	{
		a[(int)s1[i]-'A']++;
		b[(int)s2[i]-'A']++;
	}
	int k1=0,k2=0;
	//计算a,b的字符种类 
	for(int i=0;i<26;i++)
	{
		if(a[i]!=0)
			k1++;
		
		if(b[i]!=0)
			k2++;
	}
	
/*	//测试
	printf("%d   %d\n",k1,k2);
	for(int i=0;i<26;i++)
		printf("%d  %d\n",a[i],b[i]);
*/	
	 
	qsort(a,26,sizeof(a[0]),cmpi);
	qsort(b,26,sizeof(b[0]),cmpi);
	
	int flag=0;
	for(int i=0;i<26;i++)
	{
		if(a[i]!=b[i])
			{
				flag=0;
				break;
			}
		else flag=1;
	}
/*  //测试
	printf("%d\n",len);
	printf("\n%s\n%s\n",s1,s2);
	for(int i=0;i<26;i++)
	printf("%d  %d\n",a[i],b[i]); 
*/	
	
		 
	 
	int len2=strlen(s2);
	if(len!=len2)
		 flag=0;//非法输入 
	 
	if(k1!=k2)
		flag=0;//字符种类不同 
	 
	if(flag)
		printf("YES\n");
	else
		printf("NO\n");	
	
	
	memset(s1,0,sizeof(s1));
	memset(s2,0,sizeof(s2));
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	} 
	return 0;
} 

 

 

好激动啊终于AC了,搞了一上午。菜。

 

点赞