manacher

#include <bits/stdc++.h>
using namespace std;

const int maxN=11000000+10;

char s[maxN],ss[maxN<<1];

int R[maxN<<1];

int manacher(char *S,int Len) {
  int Max=0,Mid=0;
  for(int i=0;i<Len;i++) {
    if(Max<i) R[i]=1;
    else R[i]=min(R[(Mid<<1)-i],Max-i);
    while(i+R[i]<Len && i-R[i]>=0 && S[i+R[i]]==S[i-R[i]]) R[i]++;
    if(Max<i+R[i]-1) Max=i+R[i]-1,Mid=i;
  }
  int ret=0;
  for(int i=0;i<Len;i++) ret=max(ret,R[i]); ret--;
  return ret;
}

int main() {
  scanf("%s",s);
  int N=0,n=strlen(s);
  for(int i=0;i<n;i++) {
    ss[N++]='#',ss[N++]=s[i];
  }
  ss[N++]='#',ss[N]='\0';
  printf("%d\n",manacher(ss,N));
  return 0;
}
posted @ 2020-10-10 21:14  darkroome  阅读(49)  评论(0编辑  收藏  举报