{模板}Manacher最长回文子串

求字符串st(仅包含’a’~’z’)最长回文字串直径

#include
#include
#include
#include
#define fo(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
const int maxn=10000;
char st[maxn];
int n,f[maxn],a[maxn];
void scan()
{
    char ch=getchar();
    st[n=1]='#';
    while(ch>='a' && ch<='z') st[++n]=ch,st[++n]='#',ch=getchar();
}
int main()
{ 
    scan();
    int mid=0;
    fo(i,1,n)
    {
        if(mid+f[mid]>=i) f[i]=min(mid+f[mid]-i,f[mid-(i-mid)]);
        while(st[i+f[i]+1] && st[i+f[i]+1]==st[i-f[i]-1]) f[i]++;
        if(i+f[i]>mid+f[mid]) mid=i;
    }
    int max=0;
    fo(i,1,n)
        if(f[i]>max) max=f[i];
    printf("%d",max);
}

你可能感兴趣的:({模板}Manacher最长回文子串)