Cod sursa(job #934491)

Utilizator deividFlorentin Dumitru deivid Data 30 martie 2013 18:58:13
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<stdio.h>
#include<cstring>

#define maxn 1000005

FILE*f=fopen("pscpld.in","r");
FILE*g=fopen("pscpld.out","w");

int n;
int lung[maxn<<1];
char sir[maxn];

inline int min ( const int &a , const int &b ){
	return a <= b ? a : b;
}

int main () {
	
	fscanf(f,"%s",sir+1); n = strlen(sir+1);
	
	int st = 0,dr = 0;
	for ( int i = 1 ; i <= n+n-1 ; ++i ){
		
		if ( ((i+1)>>1)+!(i&1) > dr ){
			int p = (i+1)>>1,u = ((i+1)>>1)+!(i&1);
			while ( p > 0 && u <= n && sir[p] == sir[u] ){
				--p; ++u; ++lung[i];
			}
			++p; --u; st = p; dr = u;
		}
		else{
			
			lung[i] = min(lung[i-(dr-st+1)-2*((dr-st+1)&1)],dr-((i+1)>>1));
			int p = ((i+1)>>1)-lung[i],u = ((i+1)>>1)+lung[i]+!(i&1);
			while ( p > 0 && u <= n && sir[p] == sir[u] ){
				--p; ++u; ++lung[i];
			}
			++p; --u;
			if ( u > dr ){
				st = p,dr = u;
			}
		}
	}
	
	long long sol = 0;
	for ( int i = 1 ; i <= n+n-1 ; ++i ){
		sol += lung[i];
	}
	
	fprintf(g,"%lld\n",sol);
	
	fclose(f);
	fclose(g);
	
	return 0;
}