結果
| 問題 |
No.8015 アンチローリングハッシュ
|
| ユーザー |
|
| 提出日時 | 2020-03-06 22:01:48 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 417 ms / 2,000 ms |
| コード長 | 1,565 bytes |
| コンパイル時間 | 199 ms |
| コンパイル使用メモリ | 12,416 KB |
| 実行使用メモリ | 20,224 KB |
| 最終ジャッジ日時 | 2024-10-14 06:57:58 |
| 合計ジャッジ時間 | 11,337 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 21 |
ソースコード
import os
import sys
if os.getenv("LOCAL"):
sys.stdin = open("_in.txt", "r")
sys.setrecursionlimit(10 ** 9)
INF = float("inf")
IINF = 10 ** 18
MOD = 10 ** 9 + 7
class RollingHash:
def __init__(self, seq, base=10 ** 9 + 7, mod=2 ** 89 - 1):
"""
:param str|typing.Sequence[int] seq:
:param int base:
:param int mod:
"""
if isinstance(seq, str):
self._seq = seq = list(map(ord, seq))
else:
self._seq = seq
self._size = len(seq)
self._base = base
self._mod = mod
hashes = [0] * (len(seq) + 1)
power = [1] * (len(seq) + 1)
for i, c in enumerate(seq):
hashes[i + 1] = (hashes[i] * base + c) % mod
power[i + 1] = power[i] * base % mod
self._hashes = hashes
self._power = power
def get(self, L, r):
"""
[L, r) のハッシュ値を取得します
:param int L:
:param int r:
"""
if L >= r:
return 0
return (self._hashes[r] - self._hashes[L] * self._power[r - L]) % self._mod
import random
A, B = list(map(int, sys.stdin.buffer.readline().split()))
S = ''
for _ in range(10 ** 5):
S += chr(random.randint(ord('a'), ord('z')))
# 鳩の巣原理
rh = RollingHash(S, base=A, mod=B)
l = 0
r = 100
hist = {}
while r <= len(S):
h = rh.get(l, r)
if h in hist:
pl, pr = hist[h]
print(S[l:r])
print(S[pl:pr])
break
hist[h] = l, r
l += 1
r += 1
else:
assert False