結果
問題 |
No.2858 Make a Palindrome
|
ユーザー |
![]() |
提出日時 | 2024-09-18 07:11:48 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 2,364 ms / 3,000 ms |
コード長 | 1,311 bytes |
コンパイル時間 | 291 ms |
コンパイル使用メモリ | 12,672 KB |
実行使用メモリ | 45,644 KB |
最終ジャッジ日時 | 2024-09-18 07:13:14 |
合計ジャッジ時間 | 83,862 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 40 |
ソースコード
import sys input = sys.stdin.readline # Manacher # https://snuke.hatenablog.com/entry/2014/12/02/235837 def maxpan(S2): T=[] for i in range(len(S2)): T.append(S2[i]) T.append("!") T.pop() S=T LEN=len(S) i=0 j=0 R=[0]*LEN # 文字 i を中心とする最長の回文の半径 while i<LEN: while i-j>=0 and i+j<LEN and S[i-j]==S[i+j]: j+=1 R[i]=j k=1 while i-k>=0 and i+k<LEN and k+R[i-k]<j: R[i+k]=R[i-k] k+=1 i+=k j-=k MAX=0 #print(R) for i in range(LEN): if i%2==0: if R[i]%2==0: MAX=max(MAX,R[i]-1) else: MAX=max(MAX,R[i]) else: if R[i]%2==1: MAX=max(MAX,R[i]-1) else: MAX=max(MAX,R[i]) return MAX T=int(input()) for tests in range(T): N,M=map(int,input().split()) S=list(input().strip()) A=[maxpan(S),maxpan(S+S),maxpan(S+S+S)] if A[0]>=M: print(1) continue if A[1]>=M: print(2) continue if A[2]-A[1]==0: print(-1) continue f=A[1] plus=A[2]-A[1] # f+ plus*(x-1)>=M print((M-f+plus-1)//plus+2)