众所周知,manacher可以On求最长回文子串 ,但是神奇的字符串hash也可以做到求最长回文串。
步骤:
- 预处理字符串,类似于manacher,每两个字符中间插入‘#’,因为这样才能枚举中心。
- 预处理正哈希和逆哈希,如果正哈希[l,r]==逆哈希[l,r],说明两个字符串相同。
- 枚举回文中心,二分求回文半径。
可以看出,时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn),代码如下:
unsigned long long order1[2000100], order2[2000100];
unsigned long long pwd[2000100], base = 13331;
char s[2000100];
char s2[2000100];
int ct = 1;
bool check(int pos, int r)
{
unsigned long long temp1 = order1[pos + r - 1] - order1[pos - 1] * pwd[r];
unsigned long long temp2 = order2[pos - r + 1] - order2[pos + 1] * pwd[r];
if (temp1 == temp2)
return 1;
return 0;
}
int main()
{
pwd[0] = 1;
for (int i = 1; i <= 1000000; i++)

本文介绍如何利用字符串Hash方法求解最长回文子串问题,通过预处理字符串并使用正逆哈希,避免了传统的Manacher算法,提供了两种实现方案,一种为O(nlogn)的时间复杂度,另一种优化到O(n)。
最低0.47元/天 解锁文章
433

被折叠的 条评论
为什么被折叠?



