TLE代码:
#include <iostream>
using namespace std;
const int N = 44000005;
int n, hw[N], ans = 1;
char c, s[N << 1];
void manacher(){
int mxr = 0, mid;
for(int i = 1; i < n; i++){
if(i < mxr)
hw[i] = min(hw[(mid << 1) - i], hw[mid] + mid - i);
else hw[i] = 1;
while(s[i + hw[i]] == s[i - hw[i]]) hw[i]++;
if(hw[i] + i > mxr){
mxr = hw[i] + i;
mid = i;
}
}
}
int main(){
c = getchar();
s[0] = s[++n] = '#';
while(c != '\n'){
s[++n] = c;
s[++n] = '#';
c = getchar();
}
s[++n] = 0;
manacher();
for(int i = 0; i < n; i++)
ans = max(ans, hw[i]);
printf("%d", ans - 1);
return 0;
}
AC代码:
#include <iostream>
#include <cstring>
using namespace std;
const int N = 11000005;
int n, hw[N << 1], ans = 1;
char a[N << 1], s[N << 1], c;
void manacher(){
int mxr = 0, mid;
for(int i = 1; i < n; i++){
if(i < mxr)
hw[i] = min(hw[(mid << 1) - i], hw[mid] + mid - i);
else hw[i] = 1;
while(s[i + hw[i]] == s[i - hw[i]]) hw[i]++;
if(hw[i] + i > mxr){
mxr = hw[i] + i;
mid = i;
}
}
}
void change(){
s[0] = s[1] = '#';
for(int i = 0; i < n; i++){
s[(i << 1) + 2] = a[i];
s[(i << 1) + 3] = '#';
}
n = n + 1 << 1;
s[n] = 0;
}
int main(){
scanf("%s", a);
n = strlen(a);
change();
manacher();
for(int i = 0; i < n; i++)
ans = max(ans, hw[i]);
printf("%d", ans - 1);
return 0;
}
两份代码只是在输入上不同,其中超时的一个是边输入边加'#',另一个是输入完再改。