結果
問題 |
No.874 正規表現間距離
|
ユーザー |
![]() |
提出日時 | 2025-03-31 17:59:17 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,142 bytes |
コンパイル時間 | 206 ms |
コンパイル使用メモリ | 82,404 KB |
実行使用メモリ | 759,908 KB |
最終ジャッジ日時 | 2025-03-31 18:00:25 |
合計ジャッジ時間 | 13,559 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | WA * 4 |
other | AC * 5 WA * 27 MLE * 6 |
ソースコード
import heapq def parse_regex(s): elements = [] i = 0 while i < len(s): if i + 1 < len(s) and s[i+1] in {'?', '*'}: elements.append((s[i], s[i+1])) i += 2 else: elements.append((s[i], None)) i += 1 return elements A = input().strip() B = input().strip() elements_a = parse_regex(A) elements_b = parse_regex(B) len_a = len(elements_a) len_b = len(elements_b) # Initialize DP: dp[i][a_r][j][b_r] (a_r and b_r are boolean) INF = float('inf') dp = [[[[INF] * 2 for _ in range(len_b + 1)] for __ in range(2)] for ___ in range(len_a + 1)] heap = [] # Initial state: i=0 (first element), a_r=True, j=0, b_r=True with cost 0 heapq.heappush(heap, (0, 0, 1, 0, 1)) dp[0][1][0][1] = 0 found = False while heap: cost, i, a_r_int, j, b_r_int = heapq.heappop(heap) a_r = a_r_int == 1 b_r = b_r_int == 1 if i == len_a and j == len_b and not a_r and not b_r: print(cost) found = True break if cost > dp[i][a_r_int][j][b_r_int]: continue for da in [0, 1]: for db in [0, 1]: ni_a = i nj_b = j new_a_r = a_r new_b_r = b_r allowed_a = False allowed_b = False char_a = None char_b = None if da == 0: if i < len_a and a_r and elements_a[i][1] in {'?', '*'}: allowed_a = True ni_a = i + 1 new_a_r = False elif i >= len_a: allowed_a = True ni_a = i new_a_r = False else: allowed_a = False elif da == 1: if i < len_a and a_r: allowed_a = True char_a = elements_a[i][0] mod_a = elements_a[i][1] if mod_a in {None, '?'}: ni_a = i + 1 new_a_r = False else: ni_a = i new_a_r = True if db == 0: if j < len_b and b_r and elements_b[j][1] in {'?', '*'}: allowed_b = True nj_b = j + 1 new_b_r = False elif j >= len_b: allowed_b = True nj_b = j new_b_r = False else: allowed_b = False elif db == 1: if j < len_b and b_r: allowed_b = True char_b = elements_b[j][0] mod_b = elements_b[j][1] if mod_b in {None, '?'}: nj_b = j + 1 new_b_r = False else: nj_b = j new_b_r = True if (da == 0 and not allowed_a) or (da == 1 and not allowed_a) or (db == 0 and not allowed_b) or (db == 1 and not allowed_b): continue if i < len_a and da == 1 and not allowed_a: continue if j < len_b and db == 1 and not allowed_b: continue delta = 0 if da == 1 and db == 1: if char_a != char_b: delta = 1 elif da + db == 1: delta = 1 new_cost = cost + delta if ni_a > len_a or nj_b > len_b: continue new_a_r_final = new_a_r new_b_r_final = new_b_r if ni_a == len_a: new_a_r_final = False if nj_b == len_b: new_b_r_final = False new_a_r_int = 1 if new_a_r_final else 0 new_b_r_int = 1 if new_b_r_final else 0 if new_cost < dp[ni_a][new_a_r_int][nj_b][new_b_r_int]: dp[ni_a][new_a_r_int][nj_b][new_b_r_int] = new_cost heapq.heappush(heap, (new_cost, ni_a, new_a_r_int, nj_b, new_b_r_int)) if not found: print(dp[len_a][0][len_b][0])