Cod sursa(job #138788)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 19 februarie 2008 10:28:21
Problema Lampa Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#include<stdio.h>
#include<string.h>
long int n,m,i,a,b,aa,bb,nn,lung[30],sol,
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,caux1,
solpa[50000],solpb[50000],sola[50000],solb[50000];
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];caux1=cuv[a+b];cuv[a+b]=0;
	     if(n%2)
	     { p2=&cuv[a];
	       caux=cuv[a];cuv[a]=0;
	       strcpy(solpa,p1);solpa[a]=0;
	       cuv[a]=caux;
	       strcpy(solpb,p2);solpb[b]=0;
	       if(!sol||(strcmp(solpa,sola)<0))
	       { strcpy(sola,solpa);strcpy(sola,solpa);sola[a]=0;solb[b]=0;}
	       sol++;
	     }
	     else
	     { p2=&cuv[b];
	       strcpy(solpb,p2);solpb[b]=0;
	       caux=cuv[b];cuv[b]=0;
	       strcpy(solpa,p1);solpa[a]=0;
	       cuv[b]=caux;
	       if(!sol||(strcmp(solpa,sola)<0))
	       { strcpy(sola,solpa);strcpy(sola,solpa);sola[a]=0;solb[b]=0;}
	       sol++;
	     }
	     cuv[a+b]=caux1;
	   }
	   a+=aa;b+=bb;
	}
	if(sol){fprintf(g,"%s\n",sola);fprintf(g,"%s\n",solb);}
	else 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;
}