#include<stdio.h>
#define DEFMAX 1000
#include<stdlib.h>
#include<string.h>
void printpalin( char * p, int * arr, int i, int len)
{
int k = i - len + 1 , j;
for ( j= k; j< i; j+= 2 )
for ( j= i; j>= k; j-= 2 )
}
int calclen( char * p, int * arr, int cen, int n)
{
int k= ( cen% 2 + 1 ) % 2 + 1 , count= 0 , l= ( cen- k) / 2 , r= ( cen+ k) / 2 ;
while ( l>= 0 && r< n && p[ l] == p[ r] )
{
count+= 2 ;
l--;
r++;
}
return count+ k- 1 ;
}
int main( )
{
int i, j, k, x, max= 0 , count= 0 , cen= 0 , set;
char * p
= malloc ( sizeof ( char ) * DEFMAX
) ,* temp
= p
; while ( * temp++ ) count++;
int * arr
= malloc ( sizeof ( int ) * ( 2 * count
- 1 ) ) ;
while ( cen< ( 2 * count- 1 ) )
{
x= 0 ;
set = 1 ;
//printf("cen is %d\n",cen);
//get max palin length at center cen
arr[ cen] = calclen( p, arr, cen, count) ;
//calculate next center
for ( k= 1 ; k<= arr[ cen] - 2 ; k++ )
{
if ( arr[ cen- k] < ( arr[ cen] - k) )
arr[ cen+ k] = arr[ cen - k] ;
else
{
cen+= k;
set = 0 ;
break ;
}
}
if ( set)
cen++;
}
for ( i= 0 ; i< ( 2 * count- 1 ) ; i++ )
{
if ( max< arr[ i] )
max = arr[ i] ;
}
printf ( "max length of the palindrome is %d\n " , max
) ; for ( i= 0 ; i< ( 2 * count- 1 ) ; i++ )
{
if ( max== arr[ i] )
printpalin( p, arr, i, max) ;
}
return 0 ;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2RlZmluZSBERUZNQVggMTAwMAojaW5jbHVkZTxzdGRsaWIuaD4KI2luY2x1ZGU8c3RyaW5nLmg+Cgp2b2lkIHByaW50cGFsaW4oY2hhciAqcCxpbnQgKmFycixpbnQgaSxpbnQgbGVuKQp7CglpbnQgayA9IGkgLSBsZW4gKyAxLGo7CgoJZm9yKGo9aztqPGk7ais9MikKCQlwcmludGYoIiVjIixwW2ovMl0pOwoJZm9yKGo9aTtqPj1rO2otPTIpCgkJcHJpbnRmKCIlYyIscFtqLzJdKTsKCXByaW50ZigiXG4iKTsKfQoKaW50IGNhbGNsZW4oY2hhciAqcCxpbnQgKmFycixpbnQgY2VuLGludCBuKQp7CglpbnQgaz0oY2VuJTIrMSklMisxLGNvdW50PTAsbD0oY2VuLWspLzIscj0oY2VuK2spLzI7Cgl3aGlsZShsPj0wICYmIHI8biAmJiBwW2xdPT1wW3JdKQoJewoJCWNvdW50Kz0yOwoJCWwtLTsKCQlyKys7Cgl9CglyZXR1cm4gY291bnQray0xOwp9CgppbnQgbWFpbigpCnsKCWludCBpLGosayx4LG1heD0wLGNvdW50PTAsY2VuPTAsc2V0OwoJY2hhciAqcCA9IG1hbGxvYyhzaXplb2YoY2hhcikqREVGTUFYKSwqdGVtcD1wOwoJcHJpbnRmKCJlbnRlciBzdHJpbmdcbiIpOwoJc2NhbmYoIiVzIixwKTsKCXdoaWxlKCp0ZW1wKyspY291bnQrKzsKCWludCAqYXJyID0gbWFsbG9jKHNpemVvZihpbnQpKigyKmNvdW50LTEpKTsKCQoJd2hpbGUoY2VuPCgyKmNvdW50LTEpKQoJewoJCXg9MDsKCQlzZXQgPTE7CgkJLy9wcmludGYoImNlbiBpcyAlZFxuIixjZW4pOwkKCQkvL2dldCBtYXggcGFsaW4gbGVuZ3RoIGF0IGNlbnRlciBjZW4KCQlhcnJbY2VuXSA9IGNhbGNsZW4ocCxhcnIsY2VuLGNvdW50KTsKCQkvL2NhbGN1bGF0ZSBuZXh0IGNlbnRlcgoJCWZvcihrPTE7azw9YXJyW2Nlbl0tMjtrKyspCgkJewoJCQkJaWYoYXJyW2Nlbi1rXTwoYXJyW2Nlbl0taykpCgkJCQkJYXJyW2NlbitrXSA9IGFycltjZW4gLWtdOwoJCQkJZWxzZQoJCQkJCXsKCQkJCQkJY2VuKz1rOwoJCQkJCQlzZXQgPTA7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQl9CgkJaWYoc2V0KQoJCQljZW4rKzsKCgl9CgkKCWZvcihpPTA7aTwoMipjb3VudC0xKTtpKyspCgl7CgkJCgkJaWYobWF4PGFycltpXSkKCQkJbWF4ID0gYXJyW2ldOwoJfQoJcHJpbnRmKCJtYXggbGVuZ3RoIG9mIHRoZSBwYWxpbmRyb21lIGlzICVkXG4iLG1heCk7Cglmb3IoaT0wO2k8KDIqY291bnQtMSk7aSsrKQoJewoJCWlmKG1heD09YXJyW2ldKQoJCQlwcmludHBhbGluKHAsYXJyLGksbWF4KTsKCX0KCXJldHVybiAwOwp9Cgo=