mannachar(马拉车)求最长回文子串

来源:互联网 发布:广东省工商局网络培训 编辑:程序博客网 时间:2024/06/05 18:41

mannachar(马拉车)究竟是什么东西呢?
很简单,就是能让你在O(n)的复杂度内求出一个串的最长回文子串。传统的算法复杂度是O(n^2),呐,为什么mannachar能变快呢?因为mannachar用到了算过的东西来进行优化。脑补一下,当你发现了一个回文串,那么是不是左右就对称了呢?然后左边的最长回文子串是已经求过了,所以右边对应的点的最长回文子串至少也有那么多。
先贴一波代码

#include<cstdio>#include<cstring>template <typename T>inline T max(const T x,const T y){return x>y?x:y;}template <typename T>inline T min(const T x,const T y){return x<y?x:y;}char s[11000001],t[22000010];int p[22000002],len,l;int main(){    scanf("%s",s+1),len=strlen(s+1);    t[l++]='$',t[l++]='#';    for(register int i=1;i<=len;i++)        t[l++]=s[i],t[l++]='#';    int maxx=0,num=0,res=0;    for(register int i=0;i<l;i++)    {        p[i]=maxx>i?min(p[(num<<1)-i],maxx-i):1;        while(t[i+p[i]]==t[i-p[i]])p[i]++;        if(i+p[i]>maxx)        {            maxx=i+p[i];            num=i;        }        res=max(res,p[i]);    }    printf("%d",res-1);     return 0;}

它的复杂度是O(n)的,为什么呢?请看我的代码中的maxx这个变量表示现在最长回文子串的右边界的最远值,最多移动n次,复杂度就证好啦
其实mannachar并不难,不过说实话用的场合不是很多,所以嘛,学一下,掌握一下就好啦,再去学字符串的其它算法组合一下就能做出一些题啦

原创粉丝点击