链接:点击打开链接
题意:求最长回文子串
代码:
#include <map>
#include <set>
#include <queue>
#include <string>
#include <math.h>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int siz=110005;
int L[siz<<1];
char s[siz<<1],S[siz<<1];
int manacher(int len){
int i,id,mx,ans;
id=mx=ans=0;
for(i=0;i<len;i++){
if(i<mx)
L[i]=min(mx-i,L[2*id-i]);
else
L[i]=1;
while(s[i-L[i]]==s[i+L[i]])
L[i]++;
if(i+L[i]-1>mx){
id=i;
mx=i+L[i]-1;
}
ans=max(ans,L[i]-1);
}
return ans;
} //manacher模板
int main(){
int i,len;
while(scanf("%s",S)!=EOF){
s[0]='$',s[1]='#',len=2;
for(i=0;S[i];i++){
s[len++]=S[i];
s[len++]='#';
}
s[len]='#';
printf("%d\n",manacher(len+1));
}
return 0;
}