Cod sursa(job #123613)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 16 ianuarie 2008 19:14:29
Problema PScPld Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.78 kb
#include<stdio.h>
#include<string.h>
char *s,sir[2000005];
long int L,sol,i,lung[2000005],st,dr,maxa,maxg,l1,l2,l3,pc;
int main()
{
	FILE *f,*g;f=fopen("pscpld.in","r");g=fopen("pscpld.out","w");
	sir[0]='#';
	s=&sir[1];fscanf(f,"%s",s);
	L=strlen(s);sir[L+1]='*';
	maxg=2;L=2*L;
	for(i=1;i<L;i++)
	{ if(i%2)
	  { pc=i/2+1;
	    while(sir[pc+lung[i]]==sir[pc-lung[i]])
	    lung[i]++;
	  }
	  else
	  { pc=i/2;
	    while(sir[pc+lung[i]+1]==sir[pc-lung[i]])
	    lung[i]++;
	  }
	  maxa=i+lung[i];
	  if(maxa>maxg)
	  { for(dr=maxg+1;dr<=maxa;dr++)
	    { st=2*i-dr;
	      l1=lung[st];l2=lung[dr];l3=st+lung[i]-i;
	      l1=(l1<l3)?l1:l3;
	      lung[dr]=(l1>l2)?l1:l2;
	    }
	    maxg=maxa;
	  }
	  sol=sol+lung[i];
	}
	fprintf(g,"%ld\n",sol);
	return 0;
}