Skip to content

ABC366B Vertical Writing

原题链接:B - Vertical Writing

Tag:模拟

题目描述

给定一段横排文本,请将其转换为竖排文本,并用 * 填充空白。

给定 \(N\) 个由小写英文字母组成的字符串 \(S_1,S_2,\dots,S_N\)。这些字符串中最长的长度为 \(M\)

请输出满足以下条件的 \(M\) 个字符串 \(T_1,T_2,\dots,T_M\)

  • 每个 \(T_i\) 由小写字母和 * 组成
  • 每个 \(T_i\) 的末尾不能是 *
  • 对于每个 \(1 \leq i \leq N\),满足以下条件:
    • 对于每个 \(1 \leq j \leq |S_i|\),字符串 \(T_j\) 的第 \(N-i+1\) 个字符存在,并且将 \(T_1,T_2,\dots,T_{|S_i|}\) 中的第 \(N-i+1\) 个字符按顺序连接起来后,恰好构成字符串 \(S_i\)
    • 对于每个 \(|S_i| + 1 \leq j \leq M\),字符串 \(T_j\) 的第 \(N-i+1\) 个字符要么不存在,要么是 *

其中,\(|S_i|\) 表示字符串 \(S_i\) 的长度。

数据说明:

  • \(N\)\(1\)\(100\) 之间的整数
  • \(S_i\) 是长度为 \(1\)\(100\) 的小写字母字符串

分析

直接按题意模拟即可。

代码实现

void NeverSayNever() {
    int n;
    cin >> n;
    vector<string> vec(n + 1);
    for (int i = 1; i <= n; i++) cin >> vec[i];
    int mx = 0;
    for (int i = 1; i <= n; i++) {
        mx = max(mx, (int) vec[i].size());
    }
    for (int i = 1; i <= n; i++) {
        while (vec[i].size() < mx) {
            vec[i] += '*';
        }
    }
    for (int i = 0; i < mx; i++) {
        string res;
        for (int j = n; j >= 1; j--) {
            res += vec[j][i];
        }
        while (res.back() == '*') {
            res.pop_back();
        }
        cout << res << endl;
    }
}

日志

本页面创建于 2024/8/17 20:13