Submission #47751847


Source Code Expand

#ABC329E Stamp

'''
前から決めるDPを行う。
DP[i][X]: S[0:i]まで正しい文字列になっていて(i文字目を決める直前で)、
          M-1文字前~1文字前のスタンプ状況がXにできるか?(True/False)

Xについて: 数字が小さい順にスタンプする(0ならスタンプしない)
(2,1,0): M-1文字目に最後にスタンプする

遷移: i文字目を書いてみて、これが一番上の文字になるかで遷移適否が決まる。
      遷移先の文字の組と、i文字目の種類を格納しておけば遷移ができる。
(2,1,0),0 : i文字目は塗らない
(3,1,0),2 : i文字目は2番目に塗る。2番目なのでi文字目は更新されない。
(2,1,0),3 : i文字目は3番目に塗る。i文字目は1文字目に変化する。

注意点として、i>N-M のときはスタンプが押せない(はみ出るため)。
'''

from itertools import permutations as pm

#入力受取  文字列を数列に置換('A'→0, 'Z'→25)
N,M=map(int,input().split())
S,T=[[ord(s)-ord('A') for s in input()] for _ in range(2)]

#M-1文字前から1文字前までの塗り方の列としてvalidなものを、tuple型でPに格納
P=set()
for d in range(M):  #塗る場所の個数
    for X in pm([i for i in range(1,d+1)]+[0]*(M-1-d)): P.add(X)

#P[i]=(a,b,c), Q[(a,b,c)]=i のように、Pをソートし圧縮。PとQで相互変換ができるように。
P=sorted(P); Q={j:i for i,j in enumerate(P)}

#P[i]からの(遷移先,遷移時のS[i]の文字) をRに格納する。
#i文字目には 0(塗らない),0.5(1の下に塗る), ・・・ , M-0.5(一番上に塗る)を考えればよい
R=[set() for _ in range(len(P))]
for pos,X in enumerate(P):
    for d in [0]+[i+0.5 for i in range(M)]:
        #M-1文字前から0文字前、つまりS[i]に影響を与える部分をYに全列挙する。
        #このうち最も値が大きい場所がS[i]の文字を決める。
        Y=list(X)+[d]; top=max(Y)
        if top==0: continue  #どこも塗らない場合は許容できないのでcontinue
        word=T[M-1-Y.index(top)]  #i文字目がどの文字になるか一意に定まる

        #Y[1:]を座標圧縮する。0を圧縮しない([1,2]→[0,1] にはしない)点に注意
        Y.pop(0); Z=sorted(set(Y+[0])); Z={j:i for i,j in enumerate(Z)}
        for i in range(M-1): Y[i]=Z[Y[i]]
        R[pos].add((Q[tuple(Y)],word))


#DP[i][X]: i文字目を塗る直前で、直近M-1文字の塗り方をXにできるか?
DP=[[False]*len(P) for _ in range(N+1)]
DP[0][Q[tuple([0]*(M-1))]]=True
for i in range(N):
    for X in range(len(P)):
        if DP[i][X]==False: continue
        if i<=N-M:  #スタンプを打っても盤外にはみ出ない場合
            for Y,word in R[X]:
                #S[i]==word すなわち スタンプ順を決定したときS[i]が正しくなれば遷移可能
                if S[i]==word: DP[i+1][Y]=True
        else:  #ここにスタンプが打てない場合
            for Y,word in R[X]:
                #追加条件として、末尾が0になることが必要。これは実際に変換すればわかる。
                if S[i]==word and P[Y][-1]==0: DP[i+1][Y]=True

#答えを出力
#DP[N]: S[0:N]が正しい文字列になっている状態 にどれかひとつでも到達できればYes
print('Yes' if any(DP[N]) else 'No')

Submission Info

Submission Time
Task E - Stamp
User navel_tos
Language Python (PyPy 3.10-v7.3.12)
Score 475
Code Size 3466 Byte
Status AC
Exec Time 958 ms
Memory 204088 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 475 / 475
Status
AC × 3
AC × 51
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 02_random2y_00.txt, 02_random2y_01.txt, 02_random2y_02.txt, 02_random2y_03.txt, 02_random2y_04.txt, 02_random2y_05.txt, 02_random2y_06.txt, 02_random2y_07.txt, 02_random2y_08.txt, 02_random2y_09.txt, 02_random2y_10.txt, 02_random2y_11.txt, 02_random2y_12.txt, 02_random2y_13.txt, 02_random2y_14.txt, 02_random2y_15.txt, 03_random2n_00.txt, 03_random2n_01.txt, 03_random2n_02.txt, 03_random2n_03.txt, 03_random2n_04.txt, 03_random2n_05.txt, 03_random2n_06.txt, 03_random2n_07.txt, 03_random2n_08.txt, 03_random2n_09.txt, 03_random2n_10.txt, 03_random2n_11.txt, 03_random2n_12.txt, 03_random2n_13.txt, 03_random2n_14.txt, 03_random2n_15.txt, 04_killer_00.txt, 04_killer_01.txt, 04_killer_02.txt, 04_killer_03.txt, 05_handmade_00.txt, 05_handmade_01.txt, 05_handmade_02.txt, 05_handmade_03.txt, 05_handmade_04.txt, 05_handmade_05.txt, 05_handmade_06.txt, 05_handmade_07.txt, 05_handmade_08.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 61 ms 76628 KiB
00_sample_01.txt AC 60 ms 76312 KiB
00_sample_02.txt AC 59 ms 76820 KiB
01_random_00.txt AC 152 ms 119712 KiB
01_random_01.txt AC 91 ms 96444 KiB
01_random_02.txt AC 111 ms 106448 KiB
02_random2y_00.txt AC 97 ms 93396 KiB
02_random2y_01.txt AC 114 ms 103164 KiB
02_random2y_02.txt AC 70 ms 82060 KiB
02_random2y_03.txt AC 113 ms 103116 KiB
02_random2y_04.txt AC 141 ms 106260 KiB
02_random2y_05.txt AC 137 ms 107536 KiB
02_random2y_06.txt AC 123 ms 101404 KiB
02_random2y_07.txt AC 148 ms 107788 KiB
02_random2y_08.txt AC 203 ms 115728 KiB
02_random2y_09.txt AC 246 ms 125240 KiB
02_random2y_10.txt AC 85 ms 85288 KiB
02_random2y_11.txt AC 238 ms 125336 KiB
02_random2y_12.txt AC 239 ms 122896 KiB
02_random2y_13.txt AC 586 ms 203888 KiB
02_random2y_14.txt AC 437 ms 140756 KiB
02_random2y_15.txt AC 850 ms 203980 KiB
03_random2n_00.txt AC 90 ms 95648 KiB
03_random2n_01.txt AC 116 ms 103104 KiB
03_random2n_02.txt AC 72 ms 82340 KiB
03_random2n_03.txt AC 115 ms 103156 KiB
03_random2n_04.txt AC 117 ms 103908 KiB
03_random2n_05.txt AC 123 ms 107540 KiB
03_random2n_06.txt AC 110 ms 97616 KiB
03_random2n_07.txt AC 137 ms 107736 KiB
03_random2n_08.txt AC 151 ms 121316 KiB
03_random2n_09.txt AC 172 ms 125196 KiB
03_random2n_10.txt AC 187 ms 123484 KiB
03_random2n_11.txt AC 146 ms 125580 KiB
03_random2n_12.txt AC 146 ms 121776 KiB
03_random2n_13.txt AC 452 ms 203908 KiB
03_random2n_14.txt AC 335 ms 138420 KiB
03_random2n_15.txt AC 958 ms 203908 KiB
04_killer_00.txt AC 860 ms 204088 KiB
04_killer_01.txt AC 751 ms 203608 KiB
04_killer_02.txt AC 315 ms 203500 KiB
04_killer_03.txt AC 357 ms 203724 KiB
05_handmade_00.txt AC 61 ms 76528 KiB
05_handmade_01.txt AC 60 ms 76572 KiB
05_handmade_02.txt AC 91 ms 95124 KiB
05_handmade_03.txt AC 90 ms 95324 KiB
05_handmade_04.txt AC 828 ms 203716 KiB
05_handmade_05.txt AC 59 ms 76596 KiB
05_handmade_06.txt AC 61 ms 76636 KiB
05_handmade_07.txt AC 60 ms 76484 KiB
05_handmade_08.txt AC 69 ms 81916 KiB