马拉车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;
}

posted @ 2024-04-17 22:31  涤生yang  阅读(20)  评论(0)    收藏  举报