康托展开【模板】

#include<bits/stdc++.h>
using namespace std;
const int maxn=11000002;
char a[maxn<<1];
int p[maxn<<1];
int cnt=1,rd,mid,ans;
void read()
{
    char c=getchar();
    a[0]='~';
    a[1]='|';
    while(c>='a'&&c<='z')
    { 
     a[++cnt]=c;
     a[++cnt]='|';
     c=getchar();
    }
    return;
}
int main()
{
  read();
  
  for(int i=1;i<=cnt;i++)
  {
           if(i<rd)
         p[i]=min(p[(mid<<1)-i],rd-i);
         else
         p[i]=1;
         while(a[i-p[i]]==a[i+p[i]])
         p[i]++;
         if(p[i]+i>rd)
         rd=p[i]+i,mid=i;
         ans=max(ans,p[i]);
  }      
 cout<<ans-1;
}
原文地址:https://www.cnblogs.com/xcwang/p/11676296.html