結果
問題 | No.2761 Substitute and Search |
ユーザー | magurofly |
提出日時 | 2024-05-05 23:32:26 |
言語 | Python3 (3.12.2 + numpy 1.26.4 + scipy 1.12.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,924 bytes |
コンパイル時間 | 352 ms |
コンパイル使用メモリ | 12,928 KB |
実行使用メモリ | 371,784 KB |
最終ジャッジ日時 | 2024-11-29 18:19:08 |
合計ジャッジ時間 | 61,858 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 31 ms
17,824 KB |
testcase_01 | AC | 31 ms
17,700 KB |
testcase_02 | AC | 32 ms
17,696 KB |
testcase_03 | AC | 31 ms
368,512 KB |
testcase_04 | TLE | - |
testcase_05 | TLE | - |
testcase_06 | TLE | - |
testcase_07 | TLE | - |
testcase_08 | TLE | - |
testcase_09 | TLE | - |
testcase_10 | TLE | - |
testcase_11 | TLE | - |
testcase_12 | TLE | - |
testcase_13 | TLE | - |
testcase_14 | TLE | - |
testcase_15 | TLE | - |
ソースコード
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)