时间限制 内存限制
1000 ms 65536 KB

# 题目描述

小水獭把自己的宝物放在了一个保险箱里。

为了宝物不被偷走,小水獭需要对保险箱的密码进行加密,它想到了这样一种加密方式:对于长度为 kk 的原密码,先找到满足 n×nkn×n≥k 的最小正整数 nn,然后将原密码按行填写在 n×nn×n 的矩阵中,再按列读取 n×nn×n 矩阵的每一个非空位,拼接起来得到加密后的密码。

比如原密码是 MocaLovesBread! ,它由 1515 个字符组成,所以 nn 最小取 44,将原字符按行填写在 4×44×4 矩阵中,其中 代表空位(即没有被原密码中的字符填充的位):

MocaLovesBread!\begin {matrix} M & o & c & a \\ L & o & v & e \\ s & B & r & e \\ a & d & ! & \odot \end {matrix}

再按列读取 4×44×4 矩阵的每一个非空位,得到加密后的密码 MLsaooBdcvr!aee

现在小水獭把自己的原密码交给你,你能帮它求出加密后的密码吗?

# 输入格式

一行,一个长度不超过 100000100000 的字符串,表示小水獭的原密码,字符串只由 除去空格之外的所有可见字符 组成,即 ASCII 值在 3333126126 之间的所有 9494 个字符。

# 输出格式

一行字符串,表示加密后的密码。

# 输入样例 1

MocaLovesBread!

# 输出样例 1

MLsaooBdcvr!aee

# 输入样例 2

~?HappyBirthdayBUAA!

# 输出样例 2

~ptB?yhUHBdAaiaApry!

# 题解:模拟

直接按题意模拟即可。

时间复杂度O(L)O(L),其中 LL 代表字符串的长度。

参考代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
char str[100010];
int main()
{
    // freopen("N.in", "r", stdin);
    // freopen("N.out", "w", stdout);
    scanf("%s", str);
    int len = strlen(str);
    int n = ceil(sqrt(len));
    for (int i = 0; i < n; ++ i)
        for (int j = i; j < i + n * n; j += n)
            if (j < len)
                putchar(str[j]);
    
    return 0;
}