Official

B - Vertical Writing Editorial by sotanishy


まず,2つ目の条件「各 \(T_i\) の末尾は * でない」を無視して,\(T_i\) を構成しましょう. \(T_1,T_2,\dots,T_M\) を,長さ \(N\)* のみからなる文字列として初期化します. そして,各 \(i,j\) に対し,\(S_i\)\(j\) 文字目を \(T_j\)\(N-i+1\) 文字目に代入します. これで,2つ目の条件以外は満たされます.

2つ目の条件を満たすには,各 \(T_i\) について,その末尾が * である限り削除するという操作を繰り返せばよいです.

実装例 (Python)

N = int(input())
S = [input() for _ in range(N)]
M = max(map(len, S))
T = [["*"] * N for _ in range(M)]
for i in range(N):
    for j in range(len(S[i])):
        T[j][N - i - 1] = S[i][j]
for i in range(M):
    while T[i][-1] == "*":
        T[i].pop()
    print("".join(T[i]))

実装例 (C++)

#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;
    vector<string> S(N);
    for (auto& s : S) cin >> s;
    int M = 0;
    for (auto& s : S) M = max(M, (int)s.size());
    vector<string> T(M, string(N, '*'));
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < (int)S[i].size(); ++j) {
            T[j][N - i - 1] = S[i][j];
        }
    }
    for (int i = 0; i < M; ++i) {
        while (T[i].back() == '*') {
            T[i].pop_back();
        }
        cout << T[i] << endl;
    }
}

posted:
last update: