Cod sursa(job #138776)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 19 februarie 2008 09:40:07
Problema Lampa Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<stdio.h>
#include<string.h>
long int n,m,i,a,b,aa,bb,nn,lung[30],
ni[10]={8,8,10,9,7,6,25,14,15,17},
mi[10]={523,4200,5001,8910,46189,88600,346468,590005,1010860,3027197},
ns[10]={5,40,7,32,1155,5906,1,17,12,6},
pa[10]={2,5,5,15,1,5,4,167,7,26},
pb[10]={39,320,144,415,5773,17717,5,2429,2677,3051},
sa[10]={13,13,34,21,8,5,0,233,377,987},
sb[10]={-8,-8,-21,-13,-5,-3,0,-144,-223,-610};
char cuv[3100000],*p1,*p2,caux;
long int ok(long int nnn);
long int comp(long int poz1,long int poz2,long int nrcar);
int main()
{
	FILE *f,*g;f=fopen("lampa.in","r");g=fopen("lampa.out","w");
	fscanf(f,"%ld%ld",&n,&m);
	fscanf(f,"%s",cuv);
	for(i=0;i<10;i++)if(m==mi[i])break;
	a=pa[i];b=pb[i];aa=sa[i];bb=sb[i];nn=ns[i];
	for(i=1;i<=nn;i++)
	{  lung[1]=a;lung[2]=b;
	   for(i=3;i<=n;i++)lung[i]=lung[i-2]+lung[i-1];
	   if(ok(n))
	   { p1=&cuv[0];cuv[a+b]=0;
	     if(n%2)
	     { p2=&cuv[a];
	       caux=cuv[a];cuv[a]=0;
	       fprintf(g,"%s\n",p1);
	       cuv[a]=caux;
	       fprintf(g,"%s\n",p2);
	     }
	     else
	     { p2=&cuv[b];
	       fprintf(g,"%s\n",p2);
	       cuv[b]=0;
	       fprintf(g,"%s\n",p1);
	     }
	     fcloseall();
	     return 0;
	   }
	   a+=aa;b+=bb;
	}
	fprintf(g,"0\n");
	fcloseall();
	return 0;
 }
long int ok(long int nnn)
{
	if(nnn<=3)return 1;
	if(nnn==4)
	{ if(comp(0,a+b,b))return 1;
	  return 0;
	}
	if(ok(nnn-2))
	 if(comp(0,lung[nnn-1],lung[nnn-2]))
	  if(comp(lung[nnn-4],lung[nnn-2],lung[nnn-3]))
	   return 1;
	return 0;
}
long int comp(long int poz1,long int poz2,long int nrcar)
{       long int jj;
	for(jj=0;jj<nrcar;jj++)
	 if(cuv[poz1+jj]!=cuv[poz2+jj])
	  return 0;
	return 1;
}