Hash求最长回文串的方法,
O
(
N
∗
l
o
g
N
)
O(N*logN)
O(N∗logN)的方法应该比较好想,枚举中点+二分答案即可。
至于O(N)算法。。。
假设我们已经知道了前i-1个数能构成的最长回文串长度lans,那么前i项的长度ans应该是lans、lans+1、lans+2中的一个。
然后枚举各情况即可。
int Ex_Manacher()
{
int ans=0;
for(i=1;i<=n;i++)
{
Hashl[i]=Hashl[i-1]+s[i]*_pow[i];
Hashr[i]=Hashr[i-1]+s[i]*_pow[n-i];
if(i>=ans+2&&Palindrome_String(i-ans-1,i))ans+=2;
else if(Palindrome_String(i-ans,i))ans++;
}
return ans;
}