Cod sursa(job #498386)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 4 noiembrie 2010 22:45:51
Problema Lampa Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include<cstdio>
#include<cstring>
#include<cstdlib>
const int N=1<<20;
char ch[2][N],s[1<<22];
int lung,n,m,v[2],f[2],fib[30],c[2][30];
bool ok;
void read()
{
	freopen("lampa.in","r",stdin);
	freopen("lampa.out","w",stdout);
	scanf("%d%d\n",&n,&m);
	gets(s+1);
}
void fibo(int n)
{
    lung=0;
    ++lung;
    c[1][lung]=1;
    c[0][lung]=0;
    ++lung;
    c[1][lung]=0;
    c[0][lung]=1;
	fib[1]=1;
	for(int j=2;j<=n;j++)
	{
		fib[j]=fib[j-1]+fib[j-2];
		++lung;
		c[1][lung]=fib[j-1];
		c[0][lung]=fib[j];
	}
}
void get(int conc,int pi,int pf,int runda)
{
    if(pf-pi+1==v[conc])
    {
        if(!f[conc])
        {
            int q=0;
            for(int i=pi;i<=pf;i++)
                ch[conc][++q]=s[i];
            f[conc]=true;
        }
        else
        {
            int q=0;
            for(int i=pi;i<=pf;i++)
                if(s[i]!=ch[conc][++q])
                {
                    ok=false;
                    break;
                }
        }
        return;
    }
    if(f[conc] && pf-pi+1<v[conc])
    {
        ok=false;
        return;
    }
    if(runda==1)
    {
        ok=false;
        return;
    }
    if(runda<1)
        return;
    if(runda>2 && ok)
        get(conc,pi,pi+v[conc]*c[conc][runda-2]+v[1-conc]*c[1-conc][runda-2]-1,runda-2);
    if(ok) get(1-conc,pi+v[conc]*c[conc][runda-2]+v[1-conc]*c[1-conc][runda-2],pf,runda-1);
}
void afis()
{
    for(int i=1;i>=0;i--)
    {
        for(int j=1;j<=v[i];j++)
            printf("%c",ch[i][j]);
        printf("\n");
    }
}
void solve()
{
	int b=c[0][n],a=c[1][n];
	int lim=(m/a)+1;
	for(int x=1;x<=lim;x++)
		if((m-a*x)%b==0 && m-a*x>0)
		{
			int y=(m-a*x)/b;
			v[0]=y;
			v[1]=x;
			f[0]=f[1]=false;
			memset(ch[1],'\x0',N);
 			memset(ch[0],'\x0',N);
            ok=true;
			get(n%2,1,m,n);
			if(ok)
			{
                afis();
                exit(0);
			}
		}
}
int main()
{
	read();
	fibo(25);
	solve();
	return 0;
}