Cod sursa(job #328026)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 30 iunie 2009 19:23:28
Problema Lampa Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 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 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;
   }
}

long potrivire_kmp(long VAL,long pi[Lmax/2],char A[Lmax/2]){
	long x=-1;
    ns=strlen(S);
	na=strlen(A);
    for(i=VAL;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)
   //     if(i-na+1>=poz)
          return i-na+1;
 //       else x=pi[x];
    }
    return -1;
}

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  x; ok=1;
 poz=0;

   for(i=0,z=strlen(f2);i<z && ok;++i){
   	if(f2[i]=='a'){
      	x=potrivire_kmp(poz,pia,A);
         if(x!=poz) ok=0;
         poz=poz+lga;
      }
      else{
      	x=potrivire_kmp(poz,pib,B);
         if(x!=poz) ok=0;
         poz=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;
   
}