回文串大家都很熟悉,但我们平常使用的方法是枚举中心点向外扩展求,复杂度是.但这道题,需要枚举n种字符串,每个最长为5e3,若
找最大长度会炸,所以,需要马拉车算法优化,复杂度为
。具体算法内容网上有很多。具体看代码注释吧。
#include <iostream>
#include <map>
#include <ctime>
#include <vector>
#include <climits>
#include <algorithm>
#include <random>
#include <cstring>
#include <cstdio>
#include <map>
#include <set>
#include <bitset>
#include <queue>
#define inf 0x3f3f3f3f
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);
#define rep(i, a, n) for(register int i = a; i <= n; ++ i)
#define per(i, a, n) for(register int i = n; i >= a; -- i)
#define ONLINE_JUDGE
using namespace std;
typedef long long ll;
const int mod=1e9+7;
template<typename T>void write(T x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9)
{
write(x/10);
}
putchar(x%10+'0');
}
template<typename T> void read(T &x)
{
x = 0;char ch = getchar();ll f = 1;
while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}
while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
int lcm(int a,int b){return a/gcd(a,b)*b;};
ll ksm(ll a,ll n){//看是否要mod
ll ans=1;
while(n){
if(n&1) ans=((ans%mod)*(a%mod))%mod;
a=((a%mod)*(a%mod))%mod;
n>>=1;
}
return ans%mod;
}
//==============================================================
const int maxn=5e3+10;
string str;
int p[maxn];
int solve(string pos){
memset(p,0,sizeof(p));
//预处理,给回文子串加字符
string t="$";//开头
rep(i,0,int(pos.length())-1){
t+="#";
t+=+pos[i];
//cerr<<pos[i]<<" ";
}
t+="#";//结尾
//cerr<<endl;
//cout<<t<<endl;
int id=0,mx=0;
//id为目前能到达的、最右边的、回文子串的重心
//mx为目前能到达的、最右边的、回文子串的右端点
int maxlen=-1;
//回文子串长度
int n=t.length();
rep(i,0,n-1){
p[i]=mx>i?min(p[2*id-i],mx-i):1;
while(t[i+p[i]]==t[i-p[i]]) p[i]++;
if(mx<p[i]+i) mx=p[i]+i,id=i;
if(maxlen<p[i]-1) maxlen=p[i]-1;
}
return maxlen;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
//===========================================================
IOS;
cin>>str;
int ans=0;
int n=str.length();
rep(i,1,n){
ans=max(solve(str),ans);
char ch=str[0];
str.erase(str.begin());//修改原字符串
str+=ch;
}
cout<<ans<<endl;
//===========================================================
return 0;
}
京公网安备 11010502036488号