【牛客编程巅峰赛S1第8场】playfair

playfair

https://ac.nowcoder.com/acm/problem/207928

题目

牛牛用 playfair 加密信息。加密过程中的 都由 来代替。
playfair 加密算法首先需要绘制密码表,密码表是一个 的矩阵,开始由密钥按顺序排列,其余按照未出现的字母顺序。若密钥中含有重复字母需要将重复字母去掉,若有 来代替。

加密明文需要符合以下规则:
将明文中每两个字母组成一对,若成对后是两个相同字母或留下一个字母无法成对,则不进行变化直接放入密文中。
明文对 在同一行,对应密文对 分别为紧靠 右端的字母,最后一列右端对应第一列。
明文对 在同一列,对应密文对 分别为紧靠 下方的字母,最后一行下方对应第一行。
明文对 不在同一行且不在同一列,对应密文对 分别为 确定的矩形中的同行另外两角。

现在给定密钥和明文,求出密文是什么吗?

解题思路

根据给定的密钥 绘制密码表。
使用 记录字符在密码表中的位置。使用 记录密码表中每个位置上的字符。

然后按照加密明文规则对明文 求出密文。
注意用字符 替代字符

C++代码

class Solution {
public:
    /**
     * playfair加密算法
     * @param key string字符串 密钥
     * @param str string字符串 明文
     * @return string字符串
     */
    string Encode(string key, string str) {
        // write code here
        int vis[26] = {0};
        map<char, pair<int,int>> pos;
        vector<vector<char>> matrix(5, vector<char>(5));
        int row = 0;
        int col = 0;
        for(auto c : key){
            if(c == 'j')
                c = 'i';
            int index = c - 'a';
            if(!vis[index]){
                vis[index] = 1;
                pos[c] = make_pair(row, col);
                matrix[row][col] = c;
                ++col;
                if(col==5){
                    col = 0;
                    ++row;
                }
            }
        }
        vis['j'-'a'] = 1;
        for(int i=0; i<26; ++i){
            if(!vis[i]){
                char ch = i + 'a';
                pos[ch] = make_pair(row, col);
                matrix[row][col] = ch;
                ++col;
                if(col==5){
                    col = 0;
                    ++row;
                }
            }
        }

        for(int i=1; i<str.size(); i+=2){
            if(str[i-1]=='j') str[i-1]='i';
            if(str[i]=='j') str[i]='i';
            int c1 = str[i-1];
            int c2 = str[i];
            if(c1==c2)
                continue;
            int x1 = pos[c1].first;
            int y1 = pos[c1].second;
            int x2 = pos[c2].first;
            int y2 = pos[c2].second;
            if(x1==x2){
                y1 = (y1+1)%5;
                y2 = (y2+1)%5;
                str[i-1] = matrix[x1][y1];
                str[i] = matrix[x2][y2];
            }
            else if(y1==y2){
                x1 = (x1+1)%5;
                x2 = (x2+1)%5;
                str[i-1] = matrix[x1][y1];
                str[i] = matrix[x2][y2];
            }
            else{
                str[i-1] = matrix[x1][y2];
                str[i] = matrix[x2][y1];
            }
        }

        return str;
    }
};
全部评论

相关推荐

昨天 11:26
清华大学 Java
打开电脑,思绪又回到了7月份刚开始的时候,感觉这个月过的如梦如幻,发生了太多事,也算是丰富了我本就是平淡的人生吧太早独立的我习惯了一切都是自己做决定,拥有绝对的决定权,而且永远不会听取别人的建议。我就是那个恋爱四年出轨的男主啦,感觉既然在牛客开了这个头,那我就要做个有始有终的人。从我出轨到结束再到和女朋友和好如初真的太像一场梦了,短短的一个月我经历了太多,也成长了很多,放下了那些本就不属于我的,找回了那些我不该放弃的。我的人生丰富且多彩,但人不能一直顺,上天总会让你的生活中出点乱子,有好有坏,让你学会一些东西,让你有成长。我和女朋友的恋爱四年太过于平淡,日常除了会制造一些小浪漫之外,我们的生活...
段哥亡命职场:不得不说,我是理解你的,你能发出来足见你是个坦诚的人,至少敢于直面自己的内心和过往的过错。 这个世界没有想象中那样非黑即白,无论是农村还是城市,在看不见的阴影里,多的是这样的事。 更多的人选择站在制高点去谩骂,一方面是社会的道德是需要制高点的,另一方面,很多人不经他人苦,却劝他人善。 大部分的我们,连自己生命的意义尚且不能明晰,道德、法律、困境,众多因果交织,人会迷失在其中,只有真的走出来之后才能看明白,可是没走出来的时候呢?谁又能保证自己能走的好,走的对呢? 可是这种问题有些人是遇不到的,不去追寻,不去探寻,也就没了这些烦恼,我总说人生的意义在过程里,没了目标也就没了过程。 限于篇幅,没法完全言明,总之,这世界是个巨大的草台班子,没什么过不去了,勇敢面对,革故鼎新才是正确,祝你早日走出来。查看图片
点赞 评论 收藏
分享
机械打工仔:不管啥专业,找工作改简历的第一课先把你那排版改了,简历上不要写个人简历四个字,找你要简历的谁不知道这个是简历?而且还占那么多空间,直接把自己名字和基础信息写上面,整体字体大一些。 还有这种经典两页简历一页大空白,导出PDF的时候多了一页几乎全是白的你自己看着不难受吗随手的事为啥不能改掉呢,这是态度问题,你试想一下你是HR你打开简历看到格式都没调整过会是什么感受?你自己都不重视你的简历,HR更不会在意。 然后内容你那个做两年咖啡就别往里写了,简历在精不在多,你在往你的简历里打字的时候就要想好这东西对你要找的工作有没有帮助。自我评价写一行就行了,不如给专业技能单开一栏。核心课程均分90这个真别写了,把你上过的有用的专业课列出来也行。有很多地方废话很多的精炼一下,比如你校内项目第一个写的那些,全然没有重点。 好好修改一下,我看你内容也挺优秀的,别被一个随便做的简历耽误了,我一个同专业的打工人看了都揪心更别说一天看几百份简历的HR
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务