最长回文子序列(动态规划)
int p[1500][1500];
int LongCommonStr(string s)
{
string sr(s);
reverse(sr.begin(),sr.end());
int n=s.size();
int p[n+1][n+1];
memset(p);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(s[i-1]==sr[j-1])
p[i][j]=p[i-1][j-1]+1;
else
p[i][j]=p[i][j-1]>p[i-1][j]?p[i][j-1]:p[i-1][j];
}
}
return p[n][n];
}
最长回文子串(Manacher算法)
#include<iostream>
#include<cstdio>
#include<cstring>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
const int MAXN(1e5);
char s[MAXN+50];
int str[2*MAXN+50];
int Len[2*MAXN+50];
int len;
void getstr() {
len=strlen(s);
str[0]='$';
str[1]='#';
for(int i=0;i<len;i++) {
str[i*2+2]=s[i];
str[i*2+3]='#';
}
len=len*2+2;
str[len]=0;
}
void Manacher() {
getstr();
int mx=0,id=0;
for(int i=1;i<len;i++) {
if(mx>i)
Len[i]=min(Len[2*id-i],mx-i);
else
Len[i]=1;
while(str[i+Len[i]]==str[i-Len[i]]) Len[i]++;
if(Len[i]+i>mx)
mx=Len[i]+i,id=i;
}
}
int main() {
while(~scanf("%s",s)) {
memset(Len,0,sizeof(Len));
Manacher();
int ans=0;
for(int i=0;i<len;i++)
ans=max(ans,Len[i]);
printf("%d\n",ans-1);
}
}