結果
問題 | No.2018 X-Y-X |
ユーザー | siganai |
提出日時 | 2022-07-22 23:22:26 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 772 ms / 2,000 ms |
コード長 | 6,346 bytes |
コンパイル時間 | 427 ms |
コンパイル使用メモリ | 87,316 KB |
実行使用メモリ | 108,160 KB |
最終ジャッジ日時 | 2023-09-17 12:27:23 |
合計ジャッジ時間 | 17,500 ms |
ジャッジサーバーID (参考情報) |
judge13 / judge11 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 171 ms
78,104 KB |
testcase_01 | AC | 170 ms
78,124 KB |
testcase_02 | AC | 167 ms
78,108 KB |
testcase_03 | AC | 169 ms
78,308 KB |
testcase_04 | AC | 169 ms
78,136 KB |
testcase_05 | AC | 169 ms
78,076 KB |
testcase_06 | AC | 620 ms
108,160 KB |
testcase_07 | AC | 772 ms
108,052 KB |
testcase_08 | AC | 625 ms
108,016 KB |
testcase_09 | AC | 627 ms
107,740 KB |
testcase_10 | AC | 369 ms
95,476 KB |
testcase_11 | AC | 480 ms
102,388 KB |
testcase_12 | AC | 491 ms
102,512 KB |
testcase_13 | AC | 554 ms
106,852 KB |
testcase_14 | AC | 664 ms
104,500 KB |
testcase_15 | AC | 641 ms
107,632 KB |
testcase_16 | AC | 523 ms
101,640 KB |
testcase_17 | AC | 689 ms
105,416 KB |
testcase_18 | AC | 496 ms
96,420 KB |
testcase_19 | AC | 569 ms
107,608 KB |
testcase_20 | AC | 669 ms
107,896 KB |
testcase_21 | AC | 499 ms
104,480 KB |
testcase_22 | AC | 701 ms
105,652 KB |
testcase_23 | AC | 179 ms
82,276 KB |
testcase_24 | AC | 621 ms
107,336 KB |
testcase_25 | AC | 643 ms
106,808 KB |
testcase_26 | AC | 685 ms
105,548 KB |
testcase_27 | AC | 456 ms
93,968 KB |
testcase_28 | AC | 169 ms
78,808 KB |
testcase_29 | AC | 219 ms
87,520 KB |
testcase_30 | AC | 179 ms
84,564 KB |
testcase_31 | AC | 542 ms
97,792 KB |
testcase_32 | AC | 674 ms
105,572 KB |
ソースコード
#!/usr/bin/env PyPy3 from collections import Counter, defaultdict, deque import itertools import re import math from functools import reduce import operator import bisect from heapq import * import functools mod=998244353 import sys input=sys.stdin.readline import typing class LazySegTree: def __init__(self, op, e, mapping, composition, _id, v): #v:初期配列 self._op = op self._e = e self._mapping = mapping self._composition = composition self._id = _id if isinstance(v, int): v = [e]*v self._n = len(v) self._log = (self._n-1).bit_length() self._size = 1 << self._log self._d = [self._e]*(2*self._size) self._lz = [self._id]*self._size for i in range(self._n): self._d[self._size+i] = v[i] for i in range(self._size-1, 0, -1): self._update(i) def set(self, p, x): p += self._size for i in range(self._log, 0, -1): self._push(p >> i) self._d[p] = x for i in range(1, self._log+1): self._update(p >> i) def get(self, p): p += self._size for i in range(self._log, 0, -1): self._push(p >> i) return self._d[p] def prod(self, left, right): if left == right: return self._e left += self._size right += self._size for i in range(self._log, 0, -1): if ((left >> i) << i) != left: self._push(left >> i) if ((right >> i) << i) != right: self._push(right >> i) sml = self._e smr = self._e while left < right: if left & 1: sml = self._op(sml, self._d[left]) left += 1 if right & 1: right -= 1 smr = self._op(self._d[right], smr) left >>= 1 right >>= 1 return self._op(sml, smr) def all_prod(self): return self._d[1] def apply(self, left, right, f): if right is None: p = left p += self._size for i in range(self._log, 0, -1): self._push(p >> i) self._d[p] = self._mapping(f, self._d[p]) for i in range(1, self._log+1): self._update(p >> i) else: if left == right: return left += self._size right += self._size for i in range(self._log, 0, -1): if ((left >> i) << i) != left: self._push(left >> i) if ((right >> i) << i) != right: self._push((right-1) >> i) l2 = left r2 = right while left < right: if left & 1: self._all_apply(left, f) left += 1 if right & 1: right -= 1 self._all_apply(right, f) left >>= 1 right >>= 1 left = l2 right = r2 for i in range(1, self._log+1): if ((left >> i) << i) != left: self._update(left >> i) if ((right >> i) << i) != right: self._update((right-1) >> i) def max_right(self, left, g): if left == self._n: return self._n left += self._size for i in range(self._log, 0, -1): self._push(left >> i) sm = self._e first = True while first or (left & -left) != left: first = False while left%2 == 0: left >>= 1 if not g(self._op(sm, self._d[left])): while left < self._size: self._push(left) left *= 2 if g(self._op(sm, self._d[left])): sm = self._op(sm, self._d[left]) left += 1 return left-self._size sm = self._op(sm, self._d[left]) left += 1 return self._n def min_left(self, right, g): if right == 0: return 0 right += self._size for i in range(self._log, 0, -1): self._push((right-1) >> i) sm = self._e first = True while first or (right & -right) != right: first = False right -= 1 while right > 1 and right%2: right >>= 1 if not g(self._op(self._d[right], sm)): while right < self._size: self._push(right) right = 2*right+1 if g(self._op(self._d[right], sm)): sm = self._op(self._d[right], sm) right -= 1 return right+1-self._size sm = self._op(self._d[right], sm) return 0 def _update(self, k): self._d[k] = self._op(self._d[2*k], self._d[2*k+1]) def _all_apply(self, k, f): self._d[k] = self._mapping(f, self._d[k]) if k < self._size: self._lz[k] = self._composition(f, self._lz[k]) def _push(self, k): self._all_apply(2*k, self._lz[k]) self._all_apply(2*k+1, self._lz[k]) self._lz[k] = self._id # treeのマージ # 32bit以上を区間長とした例 def op(x, y): return x+y # lazy(f)からtree(x)への操作 def mapping(f, x): if f == -1:return x return f ^ x # lazyの下への分解 def composition(f, g): if f == -1:return g if g == -1:return f return f ^ g # lazyの単位元 _id = -1 n = int(input()) s = list(input().rstrip()) t = list(input().rstrip()) if s[0] != t[0] or s[-1] != t[-1]: print(-1) exit() ans = 0 fl = 0 j = 0 lst = LazySegTree(op,0,mapping,composition,_id,n) for i in range(1,n-1): fl = lst.get(i) if (fl == 0 and s[i] != t[i]) or (fl == 1 and s[i] == t[i]): #print(i) j = max(j,i + 1) while j < n and ((lst.get(j-2) == 0 and s[j-2] != s[j]) or (lst.get(j-2) == 1 and s[j-2] == s[j])): j += 1 if j == n: print(-1) break lst.apply(i,j,1) ans += j - i j += 1 else: print(ans)