結果
| 問題 |
No.515 典型LCP
|
| コンテスト | |
| ユーザー |
Min_25
|
| 提出日時 | 2017-05-06 12:49:01 |
| 言語 | PyPy2 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,084 bytes |
| コンパイル時間 | 1,655 ms |
| コンパイル使用メモリ | 76,576 KB |
| 実行使用メモリ | 97,552 KB |
| 最終ジャッジ日時 | 2024-09-14 13:50:47 |
| 合計ジャッジ時間 | 7,281 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 7 WA * 8 |
ソースコード
import sys
def solve():
def ilog2(n):
return 0 if n <= 0 else n.bit_length() - 1
input = sys.stdin.readline
N = int(input())
strs = [input().rstrip() for _ in range(N)]
M, x, d = map(int, input().split())
perm = [i for i in range(N)]
perm.sort(key=lambda i: strs[i])
iperm = [0] * N
for i, p in enumerate(perm):
iperm[p] = i
size = N - 1
lcp = [0] * size
for i in range(size):
s1, s2 = strs[perm[i]], strs[perm[i + 1]]
for j in range(min(len(s1), len(s2))):
if s1[j] != s2[j]:
lcp[i] = j
break
lgN = ilog2(size)
tab = [lcp]
for k in range(1, lgN + 1):
s = 1 << (k - 1)
prev, curr = tab[-1], [0] * (size + 1 - 2 * s)
for i in range(len(curr)):
curr[i] = min(prev[i], prev[i + s])
tab += [curr]
ans = 0
mod = N * (N - 1)
for _ in range(M):
i, j = divmod(x, N - 1)
j += (i <= j)
i, j = iperm[i], iperm[j]
if i > j:
i, j = j, i
l = ilog2(j - i)
ans += min(tab[l][i], tab[l][j - (1 << l)])
x += d
if x >= mod:
x -= mod
print(ans)
solve()
Min_25