結果
| 問題 |
No.515 典型LCP
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-31 17:22:55 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,144 bytes |
| コンパイル時間 | 192 ms |
| コンパイル使用メモリ | 82,292 KB |
| 実行使用メモリ | 138,800 KB |
| 最終ジャッジ日時 | 2025-03-31 17:23:44 |
| 合計ジャッジ時間 | 4,858 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 2 |
| other | TLE * 2 -- * 13 |
ソースコード
import sys
def main():
input = sys.stdin.read().split()
ptr = 0
n = int(input[ptr])
ptr += 1
strings = []
for _ in range(n):
strings.append(input[ptr])
ptr += 1
M, x, d = map(int, input[ptr:ptr+3])
ptr += 3
MOD1 = 10**18 + 3
MOD2 = 10**18 + 7
BASE1 = 911382629
BASE2 = 3571428571
prefix_h1 = []
prefix_h2 = []
len_list = []
for s in strings:
l = len(s)
len_list.append(l)
ph1 = [0] * (l + 1)
ph2 = [0] * (l + 1)
for i in range(l):
c = ord(s[i]) - ord('a')
ph1[i+1] = (ph1[i] * BASE1 + c) % MOD1
ph2[i+1] = (ph2[i] * BASE2 + c) % MOD2
prefix_h1.append(ph1)
prefix_h2.append(ph2)
total = 0
current_x = x
n_val = n
mod_x = n_val * (n_val - 1)
for _ in range(M):
# Generate i and j
tmp = current_x
divisor = n_val - 1
if divisor == 0:
i_val = 1
j_val = 1
else:
i_val = (tmp // divisor) + 1
j_val = (tmp % divisor) + 1
# Adjust i_val and j_val
if i_val > j_val:
i_val, j_val = j_val, i_val
else:
j_val += 1
# Compute indexes
i_idx = i_val - 1
j_idx = j_val - 1
# Calculate LCP
a_len = len_list[i_idx]
b_len = len_list[j_idx]
max_k = min(a_len, b_len)
a_ph1 = prefix_h1[i_idx]
a_ph2 = prefix_h2[i_idx]
b_ph1 = prefix_h1[j_idx]
b_ph2 = prefix_h2[j_idx]
ans_k = 0
if max_k > 0:
bit = 1 << (max_k.bit_length() - 1)
while bit > 0:
current_k = ans_k | bit
if current_k > max_k:
bit >>= 1
continue
if (a_ph1[current_k] == b_ph1[current_k] and
a_ph2[current_k] == b_ph2[current_k]):
ans_k = current_k
bit >>= 1
total += ans_k
# Update x
current_x = (current_x + d) % mod_x
print(total)
if __name__ == "__main__":
main()
lam6er