Cod sursa(job #147717)

Utilizator znakeuJurba Andrei znakeu Data 3 martie 2008 13:37:21
Problema Lampa Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 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;
	
	FILE *in  = fopen("lampa.in","r");
	FILE *out = fopen("lampa.out","w");
	
	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();
	
	
	fscanf(in,"%d%d",&n,&m);
	fgets(S,MAXM-1,in);
	fgets(S,MAXM-1,in);
	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++)
						fprintf(out,"%c",S[l]);
					fprintf(out,"\n");
					for (l=0; l<b; l++)
						fprintf(out,"%c",S[l+a]);
					fprintf(out,"\n");
					return 0;
				}
			}
		}
	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++)
						fprintf(out,"%c",S[l+b]);
					fprintf(out,"\n");
					for (l=0; l<b; l++)
						fprintf(out,"%c",S[l]);
					fprintf(out,"\n");
					return 0;
				}
			}
		}
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}