Pagini recente » Cod sursa (job #27839) | Cod sursa (job #3291273) | Cod sursa (job #137208) | Cod sursa (job #1375640) | Cod sursa (job #6356)
Cod sursa(job #6356)
#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;
}