Pagini recente » redsnow_3 | Cod sursa (job #78686) | Cod sursa (job #1032851) | Cod sursa (job #53360) | Cod sursa (job #2802470)
#include <iostream>
#include <string.h>
#include <string>
#define MAX 1000000
static inline int min( int a, int b ) {
return ( a <= b ? a : b );
}
using std::string;
int pal[ 2 * MAX + 1 ], n;
char s[ MAX + 1 ];
long long cate;
string a;
int main()
{
FILE *fin = fopen( "pscpld.in", "r" );
fscanf( fin, "%s", s );
fclose( fin );
n = strlen( s );
for( int i = 0; i < n; i++ ) {
a.push_back( '#' );
a.push_back( s[ i ] );
}
a.push_back( '#' );
n = a.size();
int left = 0;
int right = -1, k = 0;
for( int i = 0; i < n; i++ ) {
if( i > right )
k = 1;
else k = min( pal[ right + left - i ], right - left + 1 );
while( i - k >= 0 && i + k < n && a[ i - k ] == a[ i + k ] )
++k;
pal[ i ] = k--;
cate += pal[ i ] / 2;
if( right < i + k ) {
right = i + k;
left = i - k;
}
}
FILE *fout = fopen( "pscpld.out", "w" );
fprintf( fout, "%lld\n", cate );
fclose( fout );
return 0;
}