| 时间限制 | 内存限制 | 
|---|---|
1000 ms | 
65536 KB | 
# 题目描述
小水獭把自己的宝物放在了一个保险箱里。
为了宝物不被偷走,小水獭需要对保险箱的密码进行加密,它想到了这样一种加密方式:对于长度为 的原密码,先找到满足 的最小正整数 ,然后将原密码按行填写在 的矩阵中,再按列读取 矩阵的每一个非空位,拼接起来得到加密后的密码。
比如原密码是  MocaLovesBread! ,它由  个字符组成,所以  最小取 ,将原字符按行填写在  矩阵中,其中  代表空位(即没有被原密码中的字符填充的位):
再按列读取  矩阵的每一个非空位,得到加密后的密码  MLsaooBdcvr!aee 。
现在小水獭把自己的原密码交给你,你能帮它求出加密后的密码吗?
# 输入格式
一行,一个长度不超过 的字符串,表示小水獭的原密码,字符串只由 除去空格之外的所有可见字符 组成,即 ASCII 值在 到 之间的所有 个字符。
# 输出格式
一行字符串,表示加密后的密码。
# 输入样例 1
MocaLovesBread!  | 
# 输出样例 1
MLsaooBdcvr!aee  | 
# 输入样例 2
~?HappyBirthdayBUAA!  | 
# 输出样例 2
~ptB?yhUHBdAaiaApry!  | 
# 题解:模拟
直接按题意模拟即可。
时间复杂度:,其中 代表字符串的长度。
参考代码:
#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;  | |
} |