[AtCoder]ABC110 C-String Transformation

alphabet with text overlay AtCoder
Photo by Magda Ehlers on Pexels.com

問題

C - String Transformation
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
問題キャプチャ。

方針

はじめは

from collections import Counter

でCounterを出して、Counterの構造に着目して\(\cdots\)なんてやっていたが、駄目だった。

s = translate(str.maketrans(s[i), t[i], s)

で実際にsの文字をtに置き換えて行く作戦も、\(0(N^2)\)かかるのでTLEに。

ここで方針を転換して、要するにsの文字とtの文字が単射になっていればswapでsからtを構成できるので、単射を実装してみる。

解答

#input
s = list(input())
t = list(input())

#output
from collections import defaultdict
d1 = defaultdict(set)
d2 = defaultdict(set)
n = len(s)

for i in range(n):
    d1[ord(t[i])].add(ord(s[i]))
    d2[ord(s[i])].add(ord(t[i]))

answer = "Yes"
for i in d1.values():
    if len(i) > 1:
        answer = "No"
for i in d2.values():
    if len(i) > 1:
        answer = "No"
print(answer)

提出結果

Submission #31307995 - AtCoder Beginner Contest 110
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

補足

defaultdictは便利。呼び出すとき

d_set = defaultdict(set)
d_list = defaultdict(list)

としておくと、

d_set[some_key].add(some_value)
d_list[some_key].append(some_value)

で一つのkeyに対して重複してvalueをもたせる事ができる。

defaultdict(set,
            {114: {99, 105},
             101: {97, 104},
             100: {100, 111},
             99: {107},
             111: {117}})

解答ではこれを利用して、\(s\rightarrow t\)と\(t \rightarrow s\)のそれぞれに対して辞書を作成し、valueが二つ以上になったら駄目という判定にしている。

コメント

タイトルとURLをコピーしました