結果
問題 |
No.465 PPPPPPPPPPPPPPPPAPPPPPPPP
|
ユーザー |
![]() |
提出日時 | 2025-04-09 21:03:04 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,105 bytes |
コンパイル時間 | 769 ms |
コンパイル使用メモリ | 82,316 KB |
実行使用メモリ | 108,116 KB |
最終ジャッジ日時 | 2025-04-09 21:05:59 |
合計ジャッジ時間 | 5,693 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 6 TLE * 1 -- * 13 |
ソースコード
import sys def main(): s = sys.stdin.readline().strip() n = len(s) if n < 4: print(0) return MOD = 10**18 + 3 BASE = 911382629 # Precompute forward hash and power forward_hash = [0] * (n + 1) power = [1] * (n + 1) for i in range(n): forward_hash[i+1] = (forward_hash[i] * BASE + ord(s[i])) % MOD power[i+1] = (power[i] * BASE) % MOD # Precompute reverse hash and power for the reversed string reversed_s = s[::-1] reverse_hash = [0] * (n + 1) for i in range(n): reverse_hash[i+1] = (reverse_hash[i] * BASE + ord(reversed_s[i])) % MOD def get_hash(h, l, r): return (h[r] - h[l] * power[r - l]) % MOD def is_palindrome(l, r): if l >= r: return False rev_l = n - r rev_r = rev_l + (r - l) forward = get_hash(forward_hash, l, r) reverse = get_hash(reverse_hash, rev_l, rev_r) return forward == reverse # Precompute P1_possible: whether S[0..i-1] is a palindrome P1_possible = [False] * (n + 1) for i in range(1, n + 1): P1_possible[i] = is_palindrome(0, i) # Precompute P3_possible and sum_p3 P3_possible = [False] * (n + 1) for k in range(n): if is_palindrome(k, n): P3_possible[k] = True sum_p3 = [0] * (n + 2) for k in range(n-1, -1, -1): sum_p3[k] = sum_p3[k + 1] + (1 if P3_possible[k] else 0) answer = 0 # Iterate all possible i (end of P1) for i in range(1, n - 2 + 1): # i can be up to n-3, since j needs to be at least i+1, and k >=j+1 needs to be valid if not P1_possible[i]: continue # Iterate possible j (end of P2) # j must be i+1 <= j <=n-2, and [i..j-1] must be a palindrome max_j = n - 2 # because k needs to be >= j+1 and <=n-1 for j in range(i + 1, max_j + 1): if not is_palindrome(i, j): continue # sum_p3[j+1] is the number of valid k >= j+1 answer += sum_p3[j + 1] print(answer) if __name__ == "__main__": main()