結果
問題 |
No.2332 Make a Sequence
|
ユーザー |
![]() |
提出日時 | 2025-06-12 19:20:52 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,491 bytes |
コンパイル時間 | 289 ms |
コンパイル使用メモリ | 82,080 KB |
実行使用メモリ | 190,128 KB |
最終ジャッジ日時 | 2025-06-12 19:21:21 |
合計ジャッジ時間 | 18,138 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 45 TLE * 1 -- * 15 |
ソースコード
def main(): import sys input = sys.stdin.read data = input().split() idx = 0 N = int(data[idx]) idx += 1 M = int(data[idx]) idx += 1 A = list(map(int, data[idx:idx+N])) idx += N B = list(map(int, data[idx:idx+M])) idx += M C = list(map(int, data[idx:idx+M])) idx += M # Compute Z-array for A + '#' + B A_str = list(map(str, A)) B_str = list(map(str, B)) concat = A_str + ['#'] + B_str L = len(concat) Z = [0] * L Z[0] = 0 # Not used l, r = 0, 0 for i in range(1, L): if i <= r: Z[i] = min(r - i + 1, Z[i - l]) while i + Z[i] < L and concat[Z[i]] == concat[i + Z[i]]: Z[i] += 1 if i + Z[i] - 1 > r: l = i r = i + Z[i] - 1 max_k = [0] * M len_A = len(A) for i in range(M): pos = len_A + 1 + i if pos < L: max_k[i] = min(Z[pos], len_A) else: max_k[i] = 0 dp = [float('inf')] * (M + 1) dp[0] = 0 for j in range(M): if dp[j] == float('inf'): continue m = max_k[j] if m == 0: continue for k in range(1, m + 1): if j + k > M: continue if dp[j + k] > dp[j] + k * C[j]: dp[j + k] = dp[j] + k * C[j] if dp[M] == float('inf'): print(-1) else: print(dp[M]) if __name__ == '__main__': main()