Cod sursa(job #587930)

Utilizator klamathixMihai Calancea klamathix Data 6 mai 2011 15:04:46
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn = 1000005;
using namespace std;

char s[maxn];
char sir[2 * maxn];
int i , j , n , cnt , lung[maxn] , st , dr , lf , rt;
long long ans;

int main()
{
	freopen("pscpld.in","r",stdin);
	freopen("pscpld.out","w",stdout);
	
	fgets( s , maxn , stdin );
	n = strlen(s) - 1;
	
	for ( i = 0 ; i < n ; ++i ) 
		sir[++cnt] = s[i] ,
		sir[++cnt] = ' ';
		
	
	for( i = 1 ; i <= 2 * n - 1 ; ++i ) {
		
		if ( i & 1 ) 
			st = i - 2 * lung[i] , dr = i + 2 * lung[i];
		else
			st = i - 1 - 2 * lung[i] , dr = i + 1 + 2 * lung[i];
			
		for(lf = st , rt = dr ; lf > 0 && rt <= 2 * n - 1 ; ) {
			
			if ( sir[lf] == sir[rt] )
				lf -= 2 , rt += 2 , lung[i]++;
			else
				break;
		}
		
		rt -= 2;
		
		for ( ; dr <= rt ; ++dr , --st) 
			lung[dr] = min( lung[st] , rt - dr + 1);
		
		ans += lung[i];
	}
			
	printf("%lld\n",ans);
	
return 0;
}