Cod sursa(job #327932)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 30 iunie 2009 16:22:17
Problema Lampa Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <stdio.h>
#include <string.h>
#define Nmax 3030000
#define Lmax 320000

char S[Nmax];  // sirul initial
char f2[Lmax]; // sirul cum trebuie ca arate gen abbab
char A[Lmax/2],B[Lmax/2]; // cuvintele initiale

long n,m,i,lga,lgb;
long fn1,fn2;
int ok;

void fa_fib(){
	long f0,f1,f2,nr;
   for(f0=f1=1, nr=2; nr<n-1; f2=f0+f1, f0=f1,f1=f2,++nr);
   fn1=f1; fn2=f0;
}

void fa_sirAB(long n){
	char f0[120000],f1[120000];
   long nr;
   f0[0]='a'; f1[0]='b'; nr=2;
   while(nr<n){
   	strcpy(f2,f0);
      strcat(f2,f1);
      strcpy(f0,f1);
      strcpy(f1,f2);
      nr++;
   }
}

   char *ps, *pa, *pb, *p;
int vezi(long lga,long lgb){
   long i,z;
   memset(A,'\0',sizeof(A));
   memset(B,'\0',sizeof(B));
	if(n%2==1){ // incepe cu a
   	strncpy(A,S,lga);
      strncpy(B,S,lga+lgb);
      pa=&A[0];
		pb=&B[0]+lga;

   }
   else{ // incepe cu b
   	strncpy(B,S,lgb);
      strncpy(A,S,lga+lgb);
      pa=&A[0]+lgb;
		pb=&B[0];
   }

   int ok=1; ps=&S[0];
   for(i=0,z=strlen(f2);i<z && ok;++i){
   	if(f2[i]=='a'){
         p=strstr(ps,pa);
         if(ps!=p) ok=0;
         ps=ps+lga;
      }
      else{
      	p=strstr(ps,pb);
         if(ps!=p) ok=0;
         ps=ps+lgb;
      }
   }
   return ok;
}



int main(){
	freopen("lampa.in","r",stdin);
   freopen("lampa.out","w",stdout);
   scanf("%ld%ld",&n,&m);
   scanf("%s",&S);
   fa_fib();

   fa_sirAB(n);

   lga=1; ok=0;
   while(lga * fn2 <m && !ok){
   	if( (m-lga*fn2)%fn1==0 ){
      	lgb=(m-lga*fn2)/fn1;
         ok=vezi(lga,lgb);
      }
      lga++;
   }

   if(ok){ printf("%s\n",pa); printf("%s\n",pb); }
   else printf("0\n");
   fclose(stdin); fclose(stdout);
   return 0;
   
}