結果
| 問題 |
No.962 LCPs
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-20 18:55:43 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 141 ms / 2,000 ms |
| コード長 | 1,974 bytes |
| コンパイル時間 | 372 ms |
| コンパイル使用メモリ | 82,212 KB |
| 実行使用メモリ | 114,184 KB |
| 最終ジャッジ日時 | 2025-03-20 18:57:23 |
| 合計ジャッジ時間 | 6,967 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 64 |
ソースコード
import sys
def main():
n = int(sys.stdin.readline())
s = [sys.stdin.readline().strip() for _ in range(n)]
if n == 0:
print(0)
return
sum1 = sum(len(x) for x in s)
if n == 1:
print(sum1)
return
m = n - 1
h = []
for i in range(m):
a = s[i]
b = s[i+1]
min_len = min(len(a), len(b))
lcp = 0
while lcp < min_len and a[lcp] == b[lcp]:
lcp += 1
h.append(lcp)
# Compute left boundaries
left = [-1] * m
stack = []
for i in range(m):
while stack and h[stack[-1]] >= h[i]:
stack.pop()
if stack:
left[i] = stack[-1]
else:
left[i] = -1
stack.append(i)
# Compute right boundaries
right = [m] * m
stack = []
for i in range(m-1, -1, -1):
while stack and h[stack[-1]] > h[i]:
stack.pop()
if stack:
right[i] = stack[-1]
else:
right[i] = m
stack.append(i)
sum2 = 0
for k in range(m):
current_h = h[k]
l = left[k]
r = right[k]
cnt_left = k - l
cnt_right = r - k
# Calculate sum_y: sum of y from k to r-1 (inclusive)
lower = k
upper = r - 1
num_terms = upper - lower + 1
if num_terms <= 0:
sum_y = 0
else:
sum_y = (lower + upper) * num_terms // 2
# Calculate sum_x: sum of x from l+1 to k (inclusive)
lower_x = l + 1
upper_x = k
num_terms_x = upper_x - lower_x + 1
if num_terms_x <= 0:
sum_x = 0
else:
sum_x = (lower_x + upper_x) * num_terms_x // 2
term1 = cnt_left * sum_y
term2 = cnt_right * sum_x
term = (term1 - term2) + 2 * cnt_left * cnt_right
sum2 += current_h * term
print(sum1 + sum2)
if __name__ == "__main__":
main()
lam6er