結果
問題 | No.1695 Mirror Mirror |
ユーザー |
|
提出日時 | 2021-10-01 22:54:03 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 2,714 bytes |
コンパイル時間 | 337 ms |
コンパイル使用メモリ | 82,304 KB |
実行使用メモリ | 180,412 KB |
最終ジャッジ日時 | 2024-12-29 20:07:22 |
合計ジャッジ時間 | 16,567 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 60 RE * 1 |
ソースコード
class SegmentTree:def __init__(self, init_val, segfunc, ide_ele):n = len(init_val)self.segfunc = segfuncself.ide_ele = ide_eleself.num = 1 << (n - 1).bit_length()self.tree = [ide_ele] * 2 * self.numself.size = nfor i in range(n):self.tree[self.num + i] = init_val[i]for i in range(self.num - 1, 0, -1):self.tree[i] = self.segfunc(self.tree[2 * i], self.tree[2 * i + 1])def update(self, k, x):k += self.numself.tree[k] = xwhile k > 1:k >>= 1self.tree[k] = self.segfunc(self.tree[2*k], self.tree[2*k+1])def query(self, l, r):if r==self.size:r = self.numres = self.ide_elel += self.numr += self.numright = []while l < r:if l & 1:res = self.segfunc(res, self.tree[l])l += 1if r & 1:right.append(self.tree[r-1])l >>= 1r >>= 1for e in right[::-1]:res = self.segfunc(res,e)return resfrom math import radiansimport sys,randominput = lambda :sys.stdin.readline().rstrip()mi = lambda :map(int,input().split())li = lambda :list(mi())"""from:https://tjkendev.github.io/procon-library/python/string/manacher.html"""# 偶数長含めた回文の長さを求める# R[2*i] = L: S[i]を中心とする奇数長の最大回文# R[2*i+1] = L: S[i:i+2]を中心とする偶数長の最大回文# ダミー文字を挟むが、各 R[i] は実際の回文の文字列長と一致するdef manacher(S):C = []for a in S:C.append(a)C.append(0)C.pop()L = len(C)R = [0]*Li = j = 0while i < L:while j <= i < L-j and C[i-j] == C[i+j]:j += 1R[i] = jk = 1while j-R[i-k] > k <= i < L-k:R[i+k] = R[i-k]k += 1i += k; j -= kreturn RN,M = mi()S = input()T = input()if M&1:exit(print(-1))if any(T[i]!=T[-i-1] for i in range(M)):exit(print(-1))R = manacher(T)m = M//2INF = 10**9dp = [INF for i in range(M)]dp[-1] = 0dp = SegmentTree([INF]*M,min,INF)dp.update(M-1,0)for i in range(M-2,-1,-1):l = ir = i + (R[2*i+1]//2)tmp = dp.query(l+1,r+1) + 1if tmp < INF:dp.update(i,tmp)dp = dp.tree[dp.num:]res = INFfor i in range(N):if S[i]==T[i]:res = min(res,dp[i])else:breakfor i in range(N-1,-1,-1):if S[i]==T[M-1-(N-1-i)]:res = min(res,dp[N-1-i])else:breakif res==INF:print(-1)else:print(res)