Cod sursa(job #777299)

Utilizator ionut_blesneagIonut Blesneag ionut_blesneag Data 11 august 2012 19:49:35
Problema Lampa Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#include<fstream>
#include<string.h>
using namespace std;

ifstream f("lampa.in");
ofstream g("lampa.out");

int n,m,nc,i,j,la,lb,nrc,nrcab,gata;
int fib[30];
int l[26];
char cuv[3027200];
char a[1002720],b[1002720];
char config[3][75026];

int construieste()
{nrc=la+lb;
 for(j=2; j<l[n]; j++)
   {nrcab=0; 
    if(config[2][j]=='A')
       while(nrcab<la)
       {if(a[nrcab]!=cuv[nrc])
          return 0;
        nrcab++;
        nrc++;}
    if(config[2][j]=='B')
       while(nrcab<lb)
       {if(b[nrcab]!=cuv[nrc])
          return 0;
        nrcab++;
        nrc++;}    
   } 
 return 1;
}

void afiseaza()
{
 for(j=0; j<la; j++)
   g<<a[j];
 g<<endl;
 for(j=0; j<lb; j++)
   g<<b[j];
}
   
void sterge()
{for(j=0; j<la; j++)
   a[j]=0;
 for(j=0; j<lb; j++)
   b[j]=0;}
   
void verifica(int lxa, int lxb)
{
 if(n%2==1)
  {for(nc=0; nc<lxa; nc++)
   a[nc]=cuv[nc];
   for(nc=lxa; nc<lxa+lxb; nc++)
   b[nc-lxa]=cuv[nc];
   if(construieste())
       {gata=1;
        afiseaza();}
   else
      {sterge();}
  }
 if(n%2==0)
  {for(nc=0; nc<lxb; nc++)
   b[nc]=cuv[nc];
   for(nc=lxb; nc<lxa+lxb; nc++)
   a[nc-lxb]=cuv[nc];
   if(construieste())
       {gata=1;
        afiseaza();}} 
   else
      {sterge();}       
}

int main()
{f>>n>>m;
f.getline(cuv,3027200);
f.getline(cuv,3027200);

fib[1]=1;
fib[2]=1;
for(i=2;i<=n; i++)
  fib[i]=fib[i-1]+fib[i-2];
    
strcpy(config[0],"A");
strcpy(config[1],"B");
l[1]=1;
l[2]=1;
for(i=3; i<=n; i++)
    {strcpy(config[2],config[0]);
    strcat(config[2],config[1]);
    strcpy(config[0],config[1]);
    strcpy(config[1],config[2]);
    l[i]=l[i-2]+l[i-1];}    
  
for(la=1; la<=(m/fib[n-2]+1); la++)
    {lb=(m-la*fib[n-2])/fib[n-1];
    if(la*fib[n-2]+lb*fib[n-1]==m)
          verifica(la,lb);
    if(gata==1)
      break;      
    }

f.close();
g.close();
return 0;}