Cod sursa(job #6356)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 18 ianuarie 2007 23:25:14
Problema PScPld Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include<stdio.h>
#define fin  "pscpld.in"
#define fout "pscpld.out"
#define Nmax 2000001

int main() {
register int i,st,dr,lim1,lim2,n,sol=0;
int sir[Nmax]={0},v[Nmax]={0};
char c[Nmax];
FILE *in,*out;

	in=fopen(fin,"r"); out=fopen(fout,"w");
	fscanf(in,"%s",&c);
	
	n=1;  
	for (i=0;c[i]!=NULL;++i) {
		sir[++n]=(int)c[i];
		++n;
	}
	
	//for (i=1;i<=n;++i) printf("%c",sir[i]);

	for (i=1;i<=n;++i) {
		
		//printf("%i: ",i);
		lim1=i-v[i];

		for (st=i-v[i];st>0 && i+v[i]<=n && sir[st]==sir[i+v[i]];--st) { 
			++v[i]; 
			//printf("%i %i\n",st,dr);
		}

		lim2=st;
		
		for (++st;st<=lim1;++st) { 
			if (v[st]<st-lim2) { if (v[st]>v[2*i-st]) v[2*i-st]=v[st]; }
			else if (st-lim2>v[2*i-st]) v[2*i-st]=st-lim2;
		}
		//for (st=1;st<=n;++st) printf("%i ",v[st]);
		//printf("\n");
	}
	
	for (i=1;i<=n;++i) {
		sol=sol+(v[i]>>1); 
		//printf("%i ",v[i]);
	}
	//printf("\n");
	fprintf(out,"%i\n",sol);

	fclose(in); fclose(out);

	return 0;

}