「NOIP2009」潜伏者

 

 

 

 

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
char a[1100],b[1100],c[1100],d[1100];//密文,原文,要解密文,解密文 
int len,len1,i,j,ret=0;//ret用来表示是否符合规范不符合就ret=-1; 
gets(a);
gets(b);//输入 
gets(c);
len=strlen(a),len1=strlen(c);//分别的长度 
char s[27]={'\0'};	int y[27]={0}; 
for(i=0;i<len;i++)
{
	y[b[i]-'A']=1;//统计字母 
	
}
for(i=0;i<26;i++)
{
 if(y[i]==0){//是否出现没出现的字母 
 	ret=-1;
 }
}
for(i=0;i<len;i++)
{
for(j=i+1;j<len;j++){
	if(b[i]!=b[j]&&a[i]==a[j]){//一个原文字符只能对应一个密文 
		ret=-1;
	}
	if(b[i]==b[j]&&a[i]!=a[j]){//一个字符的密文是唯一的 
		ret=-1;
	}
}

}
for(i=0;i<len;i++)
{
	s[a[i]-'A']=b[i];//每个字符对应的解 
}

 for(i=0;i<27;i++)
 {
 	for(j=i+1;j<27;j++)
 	{
 	if(s[i]!='\0'&&s[i]==s[j]){  //解的唯一性或者解不存在 
              ret=-1;
              break;
     }
	 }
 }
 
 for(i=0;i<len1;i++)
 {
   	if(s[c[i]-'A']=='\0'){
   		ret=-1;//如果解不存在就ret=-1; 
   		break;
	   }else{
	   	 d[i]=s[c[i]-'A'];//开始解密一一对应 ,存储到d中; 
	   }
 }
 if(ret==-1)
 {
 	printf("Failed\n");//不合规范
 }else if(ret==0){//合规范打印
 	//printf("%s",d);
 	for(i=0;i<len1;i++)
 	{if(d[i]!='\0')
 	printf("%c",d[i]);//打印 ,也可以用scanf("%s",d); 
	 }
 }

这道题需要注意3点

1.原文中必须要有26个大写字母

2.一个原文字符对应一个密文字符且密文字符的解是唯一的

3.不能2个相同原文字符的解不一样,解与原文的关系是一对一,一个原文字符只能有一个解(这个是对第二条的解释)

ac了

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值