結果
| 問題 |
No.2858 Make a Palindrome
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-08-25 15:42:59 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,208 bytes |
| コンパイル時間 | 434 ms |
| コンパイル使用メモリ | 82,536 KB |
| 実行使用メモリ | 166,856 KB |
| 最終ジャッジ日時 | 2024-08-25 15:43:12 |
| 合計ジャッジ時間 | 12,869 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 WA * 19 |
ソースコード
def manacher(S):
C = []
for a in S:
C.append(a)
C.append(0)
C.pop()
L = len(C)
R = [0]*L
i = j = 0
while i < L:
while j <= i < L-j and C[i-j] == C[i+j]:
j += 1
R[i] = j
k = 1
while j-R[i-k] > k <= i < L-k:
R[i+k] = R[i-k]
k += 1
i += k; j -= k
for i in range(L):
if i & 1 == R[i] & 1:
R[i] -= 1
return R
def solve(N, M, S):
R = manacher(S)
if max(R) >= M:
print(1)
return
R = manacher(S + S)
if max(R) >= M:
print(2)
return
ans = 2000000000
for i in range(len(R)):
if i % 2 == 0:
if (R[i] + 1) // 2 + i // 2 == N + N and R[i] > N:
M -= R[i] - N
ans = min(ans, (M + N - 1) // N + 1)
else:
if (i + 1) // 2 + R[i] // 2 == N + N and R[i] > N:
M -= R[i] - N
ans = min(ans, (M + N - 1) // N + 1)
if ans == 2000000000:
print(-1)
else:
print(ans)
return
T = int(input())
for _ in range(T):
N, M = map(int, input().split())
S = input()
solve(N, M, S)