题解:P10312 [SHUPC 2024] 栅栏密码

· · 题解

直接根据题意模拟即可。

分析

可以记录明文字符串的每一位在行数为 h 的情况下会出现在第几行的第几位。得到这样的转换数组后,可以将密文字符串按顺序枚举,而转换数组也按第一行第一个数从左往右从上往下枚举,那么明文在这一转换数组所代表的位上则为密文这一位。

具体参见代码。

Code

#include <bits/stdc++.h>
using namespace std;
int k[15][100005], l[15];

int main() {
    int h;
    string s;
    cin >> h >> s;
    string ans = s;//方便设定ans(明文)的长度
    int u = 1;
    int x = 0;
    int f = 1;
    for (int i = 0; i < (int)s.size(); i++) {
        k[u][++l[u]] = x++;//转换数组
        if (u == h)//不断往右上跳
            f = -1;
        else if (u == 1)//不断往右下跳
            f = 1;
        u += f;//跳
    }
    int y = 0;
    for (int i = 1; i <= h; i++) {
        for (int j = 1; j <= l[i]; j++)
            ans[k[i][j]] = s[y++];
    }
    cout << ans;
}