Official
C - 文字の一括変換 / Bulk Character Conversion Editorial
by
C - 文字の一括変換 / Bulk Character Conversion Editorial
by
kyopro_friends
愚直に置換処理を行うと、1 回あたり \(\Omega(\sum_i |S_i|)\) 時間かかり、全体で \(\Omega(Q\sum_i |S_i|)\) 時間かかるため TLE します。
重要なのは「どの文字が最終的にどの文字に置換されるか」の情報のみです。これは各英小文字に対して実際置換処理を行うことで文字種数を \(\sigma=26\) として \(O(\sigma Q)\) 時間で求めることができます。これを用いて最後に1度だけ実際に各文字列の置換を行うことは \(O(\sum_i |S_i|)\) 時間でできるため、全体で \(O(\sigma Q+\sum_i |S_i|)\) 時間でこの問題を解くことができます。
実装例 (C++)
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, q;
cin >> n >> q;
vector<string> s(n);
for(int i=0; i<n; i++) cin >> s[i];
string alphabet = "abcdefghijklmnopqrstuvwxyz";
for(int i=0; i<q; i++){
char a, b;
cin >> a >> b;
replace(alphabet.begin(), alphabet.end(), a, b);
}
for(int i=0; i<n; i++){
string ans = "";
for(char c: s[i]){
int idx = c - 'a';
ans += alphabet[idx];
}
cout << ans << endl;
}
}
実装例 (Python)
N, Q = map(int,input().split())
S = [input() for _ in range(N)]
alphabet = "abcdefghijklmnopqrstuvwxyz"
for _ in range(Q):
a, b = input().split()
alphabet = alphabet.replace(a,b)
for s in S:
ans = []
for c in s:
i = ord(c) - ord('a')
ans.append(alphabet[i])
print("".join(ans))
posted:
last update:
