时间限制 | 内存限制 |
---|---|
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; | |
} |