题目描述;
给你一个字符串找出其最长的回文子串
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
char str[maxn]; //原字符串
char tmp[maxn<<1];//转换后的字符串
int len[maxn<<1];
//转换字符串
int init(char *st)
{
int i,len = strlen(st);
//字符串开头增加一个特殊字符,防止越界
tmp[0] = '@';
for(int i = 1;i<=2*len;i+=2){
tmp[i] = '#';
tmp[i+1] = st[i/2];
}
tmp[2*len+1] = '#';
//字符串结尾加一个字符,防治越界
tmp[2*len+2] = '$';
tmp[2*len+3] = 0;
//返回转换字符串的长度
return 2*len+1;
}
int manacher(char *st,int len1)
{
//mx即为当前计算回文串最右边字符的最大值
int mx=0,ans=0,po=0;
for(int i = 1;i<=len1;i++){
if(mx>i)
//在len[i]和mx-i中取小
len[i] = min(mx-i,len[2*po-1]);
else
len[i] = 1;//如果i>mx,要从头开始匹配
while(st[i-len[i]] == st[i+len[i]]){
len[i]++;
}
//如果新计算的回文串右端点位置大于mx,需要更新po和mx的值
if(len[i]+i>mx){
mx = len[i]+i;
po = i;
}
ans = max(ans,len[i]);
}
return ans-1;
}
int main()
{
cin>>str;
int len1 = init(str);
int x = manacher(tmp,len1);
cout<<x<<endl;
return 0;
}
asdczxvxzcdasdw
最长回文串为:dczxvxzcd