Pagini recente » Cod sursa (job #1578469) | Cod sursa (job #1490235) | Cod sursa (job #647779) | Cod sursa (job #1295532) | Cod sursa (job #2802543)
#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 );
a.push_back( '#' );
for( int i = 0; i < n; i++ ) {
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 - i + 1 );
while( i - k >= 0 && i + k < n && a[ i - k ] == a[ i + k ] )
k += 2;
--k;
if( i - k >= 0 && i + k < n && a[ i - k ] == a[ i + k ] )
++k;
pal[ i ] = k--;
int pp = pal[ i ];
cate += pp / 2LL;
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;
}