Official
B - Vertical Writing Editorial
by
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:
