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 |
|
|
| 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 |