Manacher

Manacher

最长回文子串

/*
https://www.cnblogs.com/fan1-happy/p/11166182.html
*/
# include <bits/stdc++.h>
using namespace std;

const int MAXN=2e7+100;
char s[MAXN],s_new[MAXN];
int p[MAXN];
int init()
{
   int len=strlen(s);
   s_new[0]='$';
   s_new[1]='#';
   int j=2;
   for(int i=0;i<len;++i){
       s_new[j++]=s[i];
       s_new[j++]='#';
  }
   s_new[j]='\0';

   return j;
}
int manacher()
{
   int len=init();
   int ans=-1;
   int id,mx=0;
   for(int i=1;i<=len;++i){
       if(i<mx) p[i]=min(p[2*id-i],mx-i);
       else p[i]=1;
       while(s_new[i-p[i]]==s_new[i+p[i]]) p[i]++;
       if(mx<i+p[i]){
           id=i;
           mx=i+p[i];
      }
       ans=max(ans,p[i]-1);
  }
   return ans;
}
int main()
{
   cin.getline(s,MAXN);
   printf("%d",manacher());

   return 0;
}



posted @ 2022-02-27 13:40  fengzlj  阅读(165)  评论(0)    收藏  举报