Cod sursa(job #2802507)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 18 noiembrie 2021 12:09:59
Problema PScPld Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.94 kb
#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--;
		
		int pp = pal[ i ];
		if( i & 1 )
			++pp;
		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;
}