結果
| 問題 | 
                            No.958 たぷりすたべる (回文)
                             | 
                    
| コンテスト | |
| ユーザー | 
                             gew1fw
                         | 
                    
| 提出日時 | 2025-06-12 16:36:16 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 2,132 bytes | 
| コンパイル時間 | 228 ms | 
| コンパイル使用メモリ | 82,432 KB | 
| 実行使用メモリ | 119,168 KB | 
| 最終ジャッジ日時 | 2025-06-12 16:36:29 | 
| 合計ジャッジ時間 | 7,528 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 | 
| other | AC * 23 WA * 30 | 
ソースコード
def manachers(s):
    # Transform the string to include special characters
    transformed = '#' + '#'.join(s) + '#'
    n = len(transformed)
    P = [0] * n
    C = R = 0
    for i in range(n):
        # Find the mirror position
        mirror = 2 * C - i
        if i < R:
            # Initialize P[i] to the minimum of the remaining palindrome length or the mirror's length
            P[i] = min(R - i, P[mirror])
        # Expand around the center
        a, b = i + (1 + P[i]), i - (1 + P[i])
        while a < n and b >= 0 and transformed[a] == transformed[b]:
            P[i] += 1
            a += 1
            b -= 1
        # Update the center and right boundary if a longer palindrome is found
        if i + P[i] > R:
            C = i
            R = i + P[i]
    return P
def is_palindrome(s):
    n = len(s)
    for i in range(n // 2):
        if s[i] != s[n - 1 - i]:
            return False
    return True
def main():
    import sys
    input = sys.stdin.read().split()
    ptr = 0
    N = int(input[ptr])
    ptr += 1
    K = int(input[ptr])
    ptr += 1
    Q = int(input[ptr])
    ptr += 1
    S = input[ptr]
    ptr += 1
    # Check if S is a palindrome
    s_palindrome = is_palindrome(S)
    s_len = len(S)
    # Concatenate S with itself
    s_concat = S + S
    concat_len = 2 * s_len
    # Run Manacher's algorithm on the concatenated string
    P = manachers(s_concat)
    # Precompute R for each position in the first S
    R = [0] * s_len
    for pos in range(s_len):
        expanded_pos = 2 * pos + 1
        if expanded_pos < len(P):
            R[pos] = P[expanded_pos] // 2
        else:
            R[pos] = 0  # This should not happen as the P array is computed for the entire s_concat
    # Process each query
    for _ in range(Q):
        A_i = int(input[ptr])
        ptr += 1
        x_0 = A_i - 1
        pos_in_S = x_0 % s_len
        max_r_S = R[pos_in_S]
        max_r_T = min(x_0, (K * s_len - 1) - x_0)
        if s_palindrome:
            r = max_r_T
        else:
            r = min(max_r_S, max_r_T)
        print(2 * r + 1)
if __name__ == "__main__":
    main()
            
            
            
        
            
gew1fw