結果
問題 | No.2761 Substitute and Search |
ユーザー | magurofly |
提出日時 | 2024-05-05 23:31:27 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 2,424 ms / 4,000 ms |
コード長 | 1,924 bytes |
コンパイル時間 | 163 ms |
コンパイル使用メモリ | 82,416 KB |
実行使用メモリ | 148,480 KB |
最終ジャッジ日時 | 2024-11-29 18:27:50 |
合計ジャッジ時間 | 21,804 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 50 ms
54,912 KB |
testcase_01 | AC | 50 ms
54,784 KB |
testcase_02 | AC | 48 ms
55,296 KB |
testcase_03 | AC | 47 ms
55,168 KB |
testcase_04 | AC | 2,424 ms
148,480 KB |
testcase_05 | AC | 2,203 ms
143,528 KB |
testcase_06 | AC | 627 ms
142,416 KB |
testcase_07 | AC | 2,309 ms
145,988 KB |
testcase_08 | AC | 664 ms
143,412 KB |
testcase_09 | AC | 2,322 ms
145,704 KB |
testcase_10 | AC | 622 ms
141,952 KB |
testcase_11 | AC | 2,405 ms
146,232 KB |
testcase_12 | AC | 1,539 ms
144,400 KB |
testcase_13 | AC | 1,520 ms
143,944 KB |
testcase_14 | AC | 1,545 ms
145,116 KB |
testcase_15 | AC | 1,599 ms
145,396 KB |
ソースコード
import sys import functools class SegtreeSum: def __init__(self, a): if type(a) is int: a = [0] * a n = len(a) size = 1 while size < n: size <<= 1 self.tree = [0] * (size * 2) for i, x in enumerate(a): self.tree[size + i] = x for i in reversed(range(1, size)): self.tree[i] = (self.tree[i << 1] + self.tree[i << 1 | 1]) % MOD self.size = size def __getitem__(self, p): return self.tree[self.size + p] def __setitem__(self, p, a): p += self.size self.tree[p] = a while p > 1: p >>= 1 self.tree[p] = (self.tree[p << 1] + self.tree[p << 1 | 1]) % MOD def fold(self, l, r): x = 0 l += self.size r += self.size while l < r: if l & 1 != 0: x += self.tree[l] x %= MOD l += 1 l >>= 1 if r & 1 != 0: r -= 1 x += self.tree[r] x %= MOD r >>= 1 return x N, L, Q = map(int, input().split()) MOD = (1 << 61) - 1 BASE = 0x1234567 POW = [1] * L for i in range(1, L): POW[i] = POW[i - 1] * BASE % MOD def convert(s): return [(ord(s[i]) - 0x61 + 1) * POW[i] % MOD for i in range(len(s))] S = [SegtreeSum(convert(input().strip())) for _ in range(N)] for _ in range(Q): query = input().strip().split() if query[0] == "1": k = int(query[1]) - 1 c = (ord(query[2]) - 0x61 + 1) * POW[k] % MOD d = (ord(query[3]) - 0x61 + 1) * POW[k] % MOD for s in S: if s[k] == c: s[k] = d else: t = convert(query[1]) h = functools.reduce(lambda x, y: (x + y) % MOD, t) l = len(t) ans = 0 for s in S: if s.fold(0, l) == h: ans += 1 print(ans)