小J的加密算法(比赛1第二题)

目录

Description          

Format

Input                    

Output                     

Samples

输入数据 1

输出数据 1

输入数据 2

输出数据 2

Hint2

输入数据 3

输出数据 3

输入数据 4

输出数据 4

Limitation     

解法

代码


原题          
比赛


Description          


上大学了,小J学会了一种加密算法,这种算法可以根据一个行数 m,将一个字符串进行重新排列,变成无法读懂的密文。

例如:给定一个字符串 "PAYPALISHIRING",行数 3,将其进行从上到下,从左到右的Z字形排列如下:


P   A   H   N
A P L S I I G
Y   I   R


之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。

Format


Input                    

                   
一个由英文字母及英文标点符号组成的字符串 s 及一个行数 m(1m1000),s 的长度在 11000 之间。

Output                     

输出加密字符串

Samples


输入数据 1

PAYPALISHIRING 3


输出数据 1

PAHNAPLSIIGYIR


输入数据 2

PAYPALISHIRING 4


输出数据 2

PINALSIGYAHRP


Hint2

P     I    N
A   L S  I G
Y A   H R
P     I


输入数据 3

A 1


输出数据 3

A

输入数据 4

hello,world! 3


输出数据 4

horel,ol!lwd


Limitation     

1s, 1024KiB for each test case.

解法

刚上去的时候,我直接懵了                         
啥?!

要Z型???????(此处省略9不可思议(数字单位 想知道自己查)个?)

然鹅,我经过 24\times365\times几分钟的冥思苦想,我发现了一个神奇的规律

龟哥(扔袜子):要不要脸!

好啦好啦

比如说下面这张图(字符都用*代替了)

*       *       
*      **      *
*     * *     *
*    *  *    *
*   *   *   *
*  *    *  *
* *     * *
**      **
*       *


你会发现

它更像V型呢

*           *       
*      *    *      *
*     *     *     *
*    *      *    *
*   *       *   *
*  *        *  *
* *         * *
**          **
*           *

看出来了么有?

再把空格去掉

**       
****
****
****
****
****
****
****
**


再来整理出一个周期

它长这个样儿

*
**
**
**
**
**
**
**
 *


这样一来 原来的候选人(dfs,bfs,bdfs,……)都淘汰了

只留下……

循环!

这样

不停遍历周期即可

不用暴力出奇迹,骗分过样例
     



注意:现实中会出现不完全周期,要小心



代码
 

#include<bits/stdc++.h>
using namespace std;
char p[1007];
string s[1007],o;
int l,n;
int main(){
    scanf("%s %d",&p,&l);
    while(n<strlen(p)){
        for(int i=1;i<l;i++){
            if(n==strlen(p)) break;
            s[i]+=p[n];
            n++;
        }
        if(n==strlen(p)) break;
        for(int i=l;i>1;i--){
            if(n==strlen(p)) break;
            s[i]+=p[n];
            n++;
        }
    }
    for(int i=1;i<=l;i++){
        o+=s[i];
    }
    cout<<o;
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值