結果
問題 | No.2858 Make a Palindrome |
ユーザー |
![]() |
提出日時 | 2024-08-25 16:14:52 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,164 bytes |
コンパイル時間 | 902 ms |
コンパイル使用メモリ | 82,660 KB |
実行使用メモリ | 95,340 KB |
最終ジャッジ日時 | 2024-08-25 16:15:11 |
合計ジャッジ時間 | 16,806 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 24 WA * 16 |
ソースコード
class StrHash():def __init__(self,S):self.mod = 10**9+7Len=len(S)self.Power256 = [1] * (Len + 1)for i in range(Len):self.Power256[i + 1] = self.Power256[i] * 256 % self.modS=[ord(S[i]) for i in range(Len)]self.H = [1] * (Len + 1)for i in range(Len):self.H[i + 1] = (self.H[i] * 256 + S[i]) % self.moddef getHash(self,l,r):if l>r:return 0return (self.H[r]-(self.Power256[r-l+1]*self.H[l-1]))%self.moddef isok(pos,n):if pos+n+1>N or pos-n+1<=0:return Falseif sh.getHash(pos-n+1,pos+n+1) == sh_rev.getHash(N-1-(pos+n)+1,N-1-(pos-n)+1):return Truereturn Falsedef isok2(pos,n):if pos-n+1<=0 or pos+n>N:return Falseif sh.getHash(pos-n+1,pos+n) == sh_rev.getHash(N+1-(pos+n),N+1-(pos-n+1)):return Truereturn Falsedef is_r(l,r):if sh.getHash(l+1,r+1) == sh_rev.getHash(N+1-(r+1),N+1-(l+1)):return Truereturn FalseT=int(input())for _ in range(T):N,M=map(int,input().split())S=input()sh=StrHash(S)sh_rev=StrHash(S[::-1])ans=10**20for i in range(N):left,right=0,10**10while right-left>1:mid=(right+left)//2if isok(i,mid):left=midelse:right=midif left+1+left>=M:ans=1continuefor i in range(1,N):left,right=0,10**10while right-left>1:mid=(right+left)//2if isok2(i,mid):left=midelse:right=midif left*2>=M:ans=1continuefor i in range(N-1):if is_r(0,i) and is_r(i+1,N-1):if M>=i and M>=N-1-i+1:a=ib=(N-1-i+1)ans=min(ans,-(-(M+a)//N))ans=min(ans,-(-(M+b)//N))for i in range(N-1):if is_r(0,N-1):if M<=N:ans=1else:ans=min(ans,-(-M//N))if ans==10**20:print(-1)else:print(ans)