結果
| 問題 |
No.2761 Substitute and Search
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 13 |
ソースコード
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)