Cod sursa(job #147705)

Utilizator znakeuJurba Andrei znakeu Data 3 martie 2008 13:28:59
Problema Lampa Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <stdio.h>
#include <string.h>
#define MAXN 26
#define MAXM 3027200

int F[MAXN]={0,1,1},n,m;
char *v[MAXN];
char S[MAXM];

void fib()
{
	int i;
	for (i=3; i<MAXN; i++)
	{
		F[i]=F[i-1]+F[i-2];
		v[i]=new char [F[i]+2];
		memset(v[i],0,sizeof(v[i]));
		strcat(v[i],v[i-2]);
		strcat(v[i],v[i-1]);
	}
}


int main()
{
	int i,j,a,b,ok,k,l;
	
	freopen("lampa.in","r",stdin);
	freopen("lampa.out","w",stdout);
	
	v[1]=new char [3];
	v[1][0]='a'; v[1][1]=0; v[1][2]=0;
	v[2]=new char [3];
	v[2][0]='b'; v[2][1]=0; v[2][2]=0;
	fib();
	
	
	scanf("%d%d",&n,&m);
	gets(S);
	gets(S);
	if (n%2==1)
		for (i=1; i*F[n-2]<m; i++)
			if ((m-i*F[n-2])%F[n-1]==0)
			{
				a=i; b=(m-i*F[n-2])/F[n-1]; ok=1; k=a+b;
				for (j=2; j<F[n]  && ok; j++)
				{
					if (v[n][j]=='a')
					{
						for (l=0; l<a && ok; l++,k++)
							if (S[k]!=S[l])
								ok=0;
					}
					if (v[n][j]=='b')
					{
						for (l=0; l<b && ok; l++,k++)
							if (S[k]!=S[a+l])
								ok=0;
					}
				}
				if (ok)
				{
					for (l=0; l<a; l++)
						printf("%c",S[l]);
					printf("\n");
					for (l=0; l<b; l++)
						printf("%c",S[l+a]);
					printf("\n");
					return 0;
				}
			}
		else;
	else
		for (i=1; i*F[n-2]<m; i++)
			if ((m-i*F[n-2])%F[n-1]==0)
			{
				a=i; b=(m-i*F[n-2])/F[n-1]; ok=1; k=a+b;
				for (j=2; j<F[n]  && ok; j++)
				{
					if (v[n][j]=='a')
					{
						for (l=0; l<a && ok; l++,k++)
							if (S[k]!=S[l+b])
								ok=0;
					}
					if (v[n][j]=='b')
					{
						for (l=0; l<b && ok; l++,k++)
							if (S[k]!=S[l])
								ok=0;
					}
				}
				if (ok)
				{
					for (l=0; l<a; l++)
						printf("%c",S[l+b]);
					printf("\n");
					for (l=0; l<b; l++)
						printf("%c",S[l]);
					printf("\n");
					return 0;
				}
			}
		else;
	
	fclose(stdin);
	fclose(stdout);
	return -1;
}