ZOJ 1799 - Crypto Columns 解题报告

简介: 题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=799          题目大意是解密密文。加密过程是,根据一个关键字(keyword)进行加密,假设关键字是“BATBOY”,明文是“MEET ME BY THE OLD OAK TREE”。

         题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=799

         题目大意是解密密文。加密过程是,根据一个关键字(keyword)进行加密,假设关键字是“BATBOY”,明文是“MEET ME BY THE OLD OAK TREE”。因为关键字由6个字母组成,因此我们把明文(忽略空格和标点)写成6列的形式(在结尾处补齐一些随机字母):

          MEETME
          BYTHEO
          LDOAKT
          REENTH

         这里我们在结尾处补了“NTH”,现在根据关键字给定的列次序生成密文,关键字表示了选取列的顺序,关键字是“BADBOY”,因为最小字母A位于第二列,因此我们先提取明文中的第2列,即“EYDE”放入密文,下一个最小字母是B(并且含有两个B,我们先选择靠前的列),位于第一列,因此再提取“MBLR”放入密文,然后是第4列,第3列,第5列,第6列。即提取的列顺序是2,1,4,5,3,6,因此组成的密文是“EYDEMBLRTHANMEKTETOEEOTH”:

          EYDE

          MBLR

          THAN

          MEKT

          ETDE

          EOTH

         现在依次给出关键字和密文,要求输出明文。并且有,关键字和密文都是大写字母组成,关键字不超过10个字符,密文不超过100字符。

 

         [简单分析]

         一道经典简单题,读完题目我就已经知道这道题一定可以AC了,还能解释什么呢?思路很简单,一个字符数组存储密文,另一个字符数组存储明文,但在逻辑上我们把它们都看作“二维数组”,例如上面的明文看过是plaintext[4][6], 而密文看作是line[6][4];

         假设有char s[M][N];

         则 s[i][j] 换算为一维数组就是 s[i*N+j];

         解密时,我们依次处理密文的每一行,先从关键字中选取出最小且最靠前的字母在关键字中的索引“index”,然后把密文的 【当前行】 转复制到明文的“index”列。为了处理重复性的字母,我们还需引入一个flag数组标记该字母是否已经选取过。

         所有代码如下:

 

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif Code_1799_Crypto_Columns
/*ZOJ 1799 - Crypto Columns 解密 */

#include 
<stdio.h>
#include 
<string.h>
#include 
<stdlib.h>

/*键盘映射,不超过10个字符,全部大写字母组成!*/
char keys[11];
char flag[11];/*表示这一列是否已经被处理过*/
char line[101];/*密文*/
char plaintext[101];/*明文*/

/*解密密文*/
void Decrypt()
{
    
int i,index,column, count,keysLength, lineLength;
    
char c;
    
/*清空flag*/
    memset(flag, 
0sizeof(flag));
    
/*每次需要处理的字符个数*/
    lineLength
=strlen(line);/*密文总字符数*/
    keysLength
=strlen(keys);/*键个数,即列数*/
    count
=lineLength/keysLength;
    
    plaintext[lineLength]
=0;/* null - terminated */
    
    
/*找出最小的字母*/
    
for(column=0;column<keysLength;column++)
    {
        c
='Z'+1;
        
for(i=0;i<keysLength;i++)
            
if(flag[i]==0 && keys[i]<c)
                c
=keys[i],index=i;
    
        
/*设置该列已经被处理过的标记*/
        flag[index]
=1;
        
/*处理index列!*/
    
        
/*把密文的这一行复制到明文的index列*/
        
for(i=0;i<count;i++)
        {
            
/*明文的第index列*/
            plaintext[keysLength
*+ index]=line[count*column+i];
        }
    }    
}

int main()
{
    
while(1)
    {
        gets(keys);
        
if(strcmp(keys,"THEEND")==0break;
        gets(line);
        Decrypt();
        printf(
"%s\n", plaintext);
    }
}
目录
相关文章
假如要限制每个来访问的IP,每秒钟都不超过10次,应该如何设置?
假如要限制每个来访问的IP,每秒钟都不超过10次,应该如何设置?
968 0
成功解决matplotlib.units.ConversionError: Failed to convert value(s) to axis units: ‘LiR‘
成功解决matplotlib.units.ConversionError: Failed to convert value(s) to axis units: ‘LiR‘
|
10月前
|
人工智能 自然语言处理 搜索推荐
《人工智能在鸿蒙元宇宙中的应用:数字鸿沟的加剧还是弥合》
在科技飞速发展的当下,鸿蒙元宇宙与人工智能的融合成为热门话题。这一融合带来诸多机遇和创新,但也引发对数字鸿沟加剧的担忧。技术与设备门槛、数字素养差距及数据隐私问题可能导致经济条件较差地区的人们难以享受先进体验,从而拉大数字鸿沟。然而,通过增加教育与培训机会、普及个性化体验以及促进经济发展与就业,可以有效弥合这一差距。政府、企业和教育机构应共同努力,确保技术发展造福更广泛人群,实现数字世界的公平与包容。
261 16
|
8月前
|
机器学习/深度学习 数据采集 人工智能
DeepSeek R1 最新全面综述:R1 为什么能让 LLM 像人一样思考?
DeepSeek R1 最新全面综述:R1 为什么能让 LLM 像人一样思考?
349 0
|
11月前
|
NoSQL Java Redis
秒杀抢购场景下实战JVM级别锁与分布式锁
在电商系统中,秒杀抢购活动是一种常见的营销手段。它通过设定极低的价格和有限的商品数量,吸引大量用户在特定时间点抢购,从而迅速增加销量、提升品牌曝光度和用户活跃度。然而,这种活动也对系统的性能和稳定性提出了极高的要求。特别是在秒杀开始的瞬间,系统需要处理海量的并发请求,同时确保数据的准确性和一致性。 为了解决这些问题,系统开发者们引入了锁机制。锁机制是一种用于控制对共享资源的并发访问的技术,它能够确保在同一时间只有一个进程或线程能够操作某个资源,从而避免数据不一致或冲突。在秒杀抢购场景下,锁机制显得尤为重要,它能够保证商品库存的扣减操作是原子性的,避免出现超卖或数据不一致的情况。
314 10
|
分布式计算 NoSQL Java
2024年最新推荐3款可以搞定中国式复杂报表的报表工具
中国式复杂报表以结构复杂、多数据源和大量信息为特点,常见于金融等领域。适合制作这类报表的工具有润乾报表、smartBI和亿信BI。润乾报表以其非线性模型擅长处理复杂报表,支持多种数据源,提供数据准备层,降低开发难度;smartBI采用真Excel架构,学习成本低,但性能可能因Excel而受限;亿信BI则注重BI功能,其在线设计器操作流畅性欠佳。在性价比方面,润乾报表以较低价格和完整功能脱颖而出。建议根据具体需求选择适合的工具进行试用。
370 1
|
机器学习/深度学习 人工智能 自然语言处理
构建未来:AI驱动的自适应学习系统
【5月更文挑战第22天】 随着人工智能技术的迅猛发展,教育领域正在经历一场由数据驱动的革新。本文将探讨AI技术在构建自适应学习系统中的关键作用,分析其如何通过个性化教学方案提高学习效率,并预测未来发展趋势。我们将深入研究机器学习算法如何识别学习者的需求,实时调整教学内容和难度,以及AI如何帮助教师和学生在教育过程中实现更好的互动和反馈。
687 0
|
机器学习/深度学习 算法 计算机视觉
蔚来感知算法岗面经
蔚来感知算法岗面经
328 0
|
机器学习/深度学习 数据采集 开发框架
Python实战案例--车型识别app
Python实战案例--车型识别app
|
安全 Java API
阿里云登录入口
本文讲解一下阿里云登录入口