Cod sursa(job #304110)

Utilizator pedobearBacauanu Vlad pedobear Data 10 aprilie 2009 22:55:21
Problema Lampa Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>

int fib[30],i,n,m,j,sol;
char cuv[3030000],a[30000],b[30000],ordine[200000];

void verif (int lna, int lnb)
{
	int i,j=0,ln,k=0;
	if (n%2==1){
		for (i=1;i<=lna;i++) a[i]=cuv[i];
		for (i=1;i<=lnb;i++) b[i]=cuv[i+lna];
	}
	else {
		for (i=1;i<=lnb;i++) b[i]=cuv[i];
		for (i=1;i<=lna;i++) a[i]=cuv[i+lnb];
	}
	
	for (i=1;i<=fib[n];i++){
		ln=1;
		if (ordine[i]=='A') 
			while (ln<=lna){
				if (a[ln]!=cuv[j+ln]) return;
				ln++;
			}
		if (ordine[i]=='B') 
			while (ln<=lnb){
				if (b[ln]!=cuv[j+ln]) return;
				ln++;
			}
		j=j+ln-1;
	}
	
	a[lna+1]=0, b[lnb+1]=0;
	printf ("%s\n%s\n",a+1,b+1);
	sol=1;
}
		

int main ()
{
	freopen ("lampa.in","r",stdin);
	freopen ("lampa.out","w",stdout);
	
	scanf ("%d %d\n",&n,&m);
	scanf ("%s",cuv+1);
	
	fib[1]=fib[2]=1;
	for (i=3;i<=n;i++) fib[i]=fib[i-1]+fib[i-2];
	
	ordine[fib[n]]='B', ordine[fib[n]-1]='A', i=4;
	while (i<=n){
		for (j=fib[n]-fib[i]+1;j<=fib[n]-fib[i-1];j++)
			ordine[j]=ordine[j+fib[i-1]];
		i++;
	}

	for (i=1;i<=m;i++){
		if ( m - i * fib[n-2] <= 0 || sol==1) break;
		if ( (m-i*fib[n-2])%fib[n-1]==0 ) verif ( i , (m-i*fib[n-2])/fib[n-1]);
	}
	
	if (sol==0) printf ("0");
	
	return 0;
}