马拉车Mananer(求最长回文子序列)
直接上板子
直接输出最长回文子序列的长度
#include<bits/stdc++.h>
using namespace std;
const int maxl=1100005;
int p[32000005]; //p[i]-1表示以i为中点的回文串长度,这个数组要大
string a;
//用于输出最大回文子序列
//string ss;
int Manacher(string s)
{
string now;
int len=s.size();
for(int i=0;i<len;i++) //将原串处理成%a%b%c%形式,保证长度为奇数
{
now+='%';
now+=s[i];
}
now+='%';
len=now.size();
int pos=0,R=0;
for (int i=0;i<len;i++)
{
if (i<R) p[i]=min(p[2*pos-i],R-i); else p[i]=1;
while (0<=i-p[i]&&i+p[i]<len&&now[i-p[i]]==now[i+p[i]]) p[i]++;
if (i+p[i]>R) {pos=i;R=i+p[i];}
}
int MAX=0;
for (int i=0;i<len;i++)
{
//用来输出最大回文子序列的
// if(p[i]-1>MAX)
// {
// ss=now.substr(i-p[i]+1,2*p[i]-1);
//
// }
MAX=max(MAX,p[i]-1);
}
return MAX; //最长回文子串长度
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>a;
cout<<Manacher(a)<<endl;
//用于输出最大回文序列了
// ss.erase(remove(ss.begin(), ss.end(), '%'), ss.end());
// cout<<ss;
return 0;
}

浙公网安备 33010602011771号