Cod sursa(job #328189)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 1 iulie 2009 12:03:49
Problema Lampa Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.63 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 pia[Lmax/2],pib[Lmax/2];
long vpi[2][Lmax/2];

long n,m,i,lga,lgb,MA,MB,na,ns,poz;
long fn1,fn2;
int ok;

void fa_prefix(long pi[Lmax/2],char A[Lmax/2]){
	na=strlen(A);
  long k=-1,x;
   pi[0]=0;
   for(x=1;x<na;++x){
   	while(k>0 && A[k+1]!=A[x])
        k=pi[k];
      if(A[k+1]==A[x])
        k++;
      pi[x]=k;
   }
}

void potrivire_kmp(long VAL,long pi[Lmax/2],char A[Lmax/2]){
	long x=-1,i;
    ns=strlen(S);
	na=strlen(A);
    for(i=0;i<ns;++i){
    	while(x>0 && A[x+1]!=S[i])
        x=pi[x];
      if(A[x+1]==S[i])
        x++;
      if(x==na-1){
          vpi[VAL][++vpi[VAL][0]]= i-na+1;
          x=pi[x];
      }
    }
}

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++;
   }
}

int vezi(long lga,long lgb){
   long i,z;
   memset(A,'\0',MA);
   memset(B,'\0',MB);
	if(n%2==1){ // incepe cu a
   	strncpy(A,S,lga);
      for(i=lga;i<=lga+lgb-1;++i)
        B[i-lga]=S[i];
   }
   else{ // incepe cu b
   	strncpy(B,S,lgb);
      for(i=lgb;i<=lga+lgb-1;++i)
        A[i-lgb]=S[i];
   }

   fa_prefix(pia,A);
   fa_prefix(pib,B);
long poza=1, pozb=1,ok=1,poz=0;
 memset(vpi[0],0,sizeof(vpi[0]));
 memset(vpi[1],0,sizeof(vpi[1]));
 potrivire_kmp(0,pia,A);
 potrivire_kmp(1,pib,B);

   for(i=0,z=strlen(f2);i<z && ok;++i){
   	if(f2[i]=='a'){
      	while(poz!=vpi[0][poza] && poza<vpi[0][0]) poza++;
         if(poz!=vpi[0][poza]) ok=0;
         poz+=lga;
      }
      else{
      	while(poz!=vpi[1][pozb] && pozb<vpi[1][0]) pozb++;
         if(poz!=vpi[1][pozb]) ok=0;
         poz+=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);

   MA=sizeof(A); if(m/fn2 < MA) MA=m/fn2;
   MB=sizeof(B); if(m/fn1 < MB) MB=m/fn1;

   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",A); printf("%s\n",B); }
   else printf("0\n");
   fclose(stdin); fclose(stdout);
   return 0;
   
}