manacher算法用于求最长回文子串
基本概念
1.回文串:举个栗子 abba abcba aaaaa a
2.回文子串:假如在一个字符串中 aaabcdcba 那么它的最长的回文子串为 bcdcb (还有其他的回文子串,不过不是最长)
3.manacher算法中会用到一个叫做len的数组,负责记录以下标为中心的最大回文子串的长度,如len[i]表示以i为中心,向左右两边扩展,能扩展到的最长的回文子串长度
Manacher算法总结 - CSDN博客 https://blog.csdn.net/dyx404514/article/details/42061017
具体代码如下
#include#include #include #define maxn 1000010 using namespace std; char st[maxn],tmp[2*maxn]; int len[2*maxn]; int max(int a,int b) { return a>b?a:b; } int min(int a,int b) { return ai)//若是符合条件1,假若len[j]超出了边界,则取边界值为初始的len[i],若是没有超出,则取len[j]值,j==2*po-i len[i]=min(mx-i,len[2*po-i]); else len[i]=1; while(tmp[i+len[i]]==tmp[i-len[i]])//向左右两边扩展 len[i]++; if(i+len[i]>mx) { mx=i+len[i]; po=i; } ans=max(ans,len[i]); } return ans-1; } int main() { scanf("%s",st); init(st); int l=strlen(tmp); printf("%d\n",manacher(tmp,l)); return 0; }
推荐题:
1.