結果
問題 |
No.515 典型LCP
|
ユーザー |
![]() |
提出日時 | 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()