内存较大的:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
#define inf 310010
char s[inf], str[inf];
int p[inf], len;
void gets()
{
int li = strlen(str);
len = 0;
s[len++] = '&';
s[len++] = '#';
for(int i=0; i<li; i++)
{
s[len++] = str[i];
s[len++] = '#';
}
}
void getp()
{
gets();
memset(p, 0, sizeof(p));
int id = 0, mx = 0;
for(int i=1; i<len; i++)
{
int j = 2*id-i;
p[i] = mx>i ? min(p[j], mx-i):1;
while(s[i+p[i]] == s[i-p[i]]) p[i]++;
if(i+p[i] > mx)
{
mx = i+p[i];
id = i;
}
}
}
int main()
{
while(~scanf("%s", str))
{
getp();
int ans=1;
for(int i=0; i<len; i++) ans = max(ans, p[i]-1);
printf("%d\n", ans);
}
return 0;
}
内存较小的:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 2000010;
int n;
char s[N];
int d1[N], d2[N];
//d1[]记录的是奇数,d2[]记录的是偶数
int main() {
scanf("%d", &n);
scanf("%s", s);
for (int i = 0, l = 0, r = -1; i < n; ++i) {
d1[i] = (i <= r ? min(d1[l + r - i], r - i + 1) : 1);
while (i - d1[i] >= 0 && i + d1[i] < n && s[i - d1[i]] == s[i + d1[i]]) ++d1[i];
if (i + d1[i] - 1 > r) l = i - d1[i] + 1, r = i + d1[i] - 1;
}
for (int i = 1, l = 0, r = -1; i < n; ++i) {
d2[i] = (i <= r ? min(d2[l + r - i + 1], r - i + 1) : 0);
while (i + d2[i] < n && i - d2[i] - 1 >= 0 && s[i + d2[i]] == s[i - d2[i] - 1]) ++d2[i];
if (d2[i] > 0 && i + d2[i] - 1 > r) l = i - d2[i], r = i + d2[i] - 1;
}
int ans = 0;
for(int i = 0; i < n; i++) {
cout<<i<<" "<<d1[i]<<" "<<d2[i]<<endl;
ans = max(ans, max(d1[i]*2-1, d2[i]*2));
}
printf("%d\n", ans);
return 0;
}
/*
9
abcbaccab
0 1 0
1 1 0
2 3 0
3 1 0
4 1 0
5 1 0
6 1 3
7 1 0
8 1 0
6
*/