Cod sursa(job #479162)

Utilizator freak93Adrian Budau freak93 Data 23 august 2010 09:30:06
Problema Lampa Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<cstdio>
#include<cstring>

using namespace std;

const char iname[]="lampa.in";
const char oname[]="lampa.out";
const int maxn=3100000;
const int maxk=35000;
const int maxf=220000;

int n,i,m,fib[30],cine[maxf],j;
char s[maxn],a[maxk],b[maxk];

bool test(int x,int y)
{
    int i,j=1,start;
    if(n&1)
    {
        for(i=1;i<=x;++i)
            a[i]=s[i];
        for(;i<=x+y;++i)
            b[i-x]=s[i];
    }
    else
    {
        for(i=1;i<=y;++i)
            b[i]=s[i];
        for(;i<=x+y;++i)
            a[i-y]=s[i];
    }
    for(i=1;i<=fib[n];++i)
    {
        if(cine[i]==1)
            for(start=1;start<=x;++start,++j)
                if(a[start]!=s[j])
                    return false;
        if(cine[i]==2)
            for(start=1;start<=y;++start,++j)
                if(b[start]!=s[j])
                    return false;
    }
    a[x+1]=0;
    b[y+1]=0;
    printf("%s\n%s\n",a+1,b+1);
    return true;
}

int main()
{
    freopen(iname,"r",stdin);
    freopen(oname,"w",stdout);
    scanf("%d%d\n",&n,&m);
    fgets(s+1,sizeof(s),stdin);
    fib[1]=fib[2]=1;
    for(i=3;i<=n;++i)
        fib[i]=fib[i-1]+fib[i-2];
    cine[fib[n]]=2;
    cine[fib[n]-1]=1;
    for(i=3;i<n;++i)
        for(j=fib[n]-fib[i+1]+1;j<=fib[n]-fib[i];++j)
            cine[j]=cine[j+fib[i]];

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