这是一道很裸的最长回文串的题目,模板直接就可已过了,不过由于细节,我TLM了好几次!
以后要狠狠注意这些细节才好
代码如下:
//最长回文子串
#include <cstdio>
#include <cstring>
const int N = 110010;
int id, n, Maxid, Maxl, p[N<<1];
char s[N], str[N<<1];
int Min( int a, int b ) { return a < b ? a:b; }
void init() {
str[0] = '$';
str[1] = '#';
int i, l = strlen(s), j = 2;
for ( i = 0; i < l; ++i ) {
str[j++] = s[i];
str[j++] = '#';
}
n = j; str[n] = '\0';
id = Maxid = Maxl = 0;
}
void kp() {
for ( int i = 1; i < n; ++i ) {
if ( Maxid > i ) p[i] = Min(p[id*2-i], Maxid-i);
else p[i] = 1;
while ( str[i+p[i]] == str[i-p[i]] ) p[i]++;
if ( p[i] + i > Maxid ) {
Maxid = p[i] + i;
id = i;
}
if ( p[i] > Maxl ) Maxl = p[i];
}
}
int main()
{
while ( scanf("%s", s) != EOF ) {
init();
kp();
printf("%d\n", Maxl-1);
}
}