Cod sursa(job #2003950)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 24 iulie 2017 14:18:08
Problema Lampa Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.82 kb
#include<fstream>
#include<string>
using namespace std;
int n, m, i, x, y, xsol, ysol, sum, ok, j;
int fib[30];
char a[80000], b[80000], sola[80000], solb[80000], c[3030000];
string s, s1, s2;
ifstream fin("lampa.in");
ofstream fout("lampa.out");
void copiere1(char a[], int p, int u){
    for(int i = p; i <= u; i++){
        a[i - p + 1] = c[i];
    }
}
void copiere2(char a[], char b[], int n){
    for(int i = 1; i <= n; i++){
        a[i] = b[i];
    }
}
int comp(char a[], int n, char b[], int m){
    for(int i = 1; i <= min(n, m); i++){
        if(a[i] != b[i]){
            if(a[i] < b[i]){
                return 1;
            }
            return 0;
        }
    }
    if(n < m){
        return 1;
    }
    return 0;
}
int main(){
    fin>> n >> m;
    fin>> c + 1;
    fib[1] = fib[2] = 1;
    s1 = 'A';
    s2 = 'B';
    for(i = 3; i <= n; i++){
        s = s1 + s2;
        s1 = s2;
        s2 = s;
        fib[i] = fib[i - 1] + fib[i - 2];
    }
    for(x = 1; x * fib[n - 2] < m; x++){
        y = m - x * fib[n - 2];
        if(y % fib[n - 1] != 0){
            continue;
        }
        y /= fib[n - 1];
        if(s[0] == 'A'){
            copiere1(a, 1, x);
            sum = x;
            for(i = 1; i < fib[n]; i++){
                if(s[i] == 'B'){
                    copiere1(b, sum + 1, sum + y);
                    break;
                }
                else{
                    sum += x;
                }
            }
        }
        else{
            copiere1(b, 1, y);
            sum = y;
            for(i = 1; i < fib[n]; i++){
                if(s[i] == 'A'){
                    copiere1(a, sum + 1, sum + x);
                    break;
                }
                else{
                    sum += y;
                }
            }
        }
        ok = 1;
        sum = 0;
        for(i = 0; i < fib[n] && ok; i++){
            if(s[i] == 'A'){
                for(j = 1; j <= x; j++){
                    if(a[j] != c[sum + j]){
                        ok = 0;
                        break;
                    }
                }
                sum += x;
            }
            else{
                for(j = 1; j <= y; j++){
                    if(b[j] != c[sum + j]){
                        ok = 0;
                        break;
                    }
                }
                sum += y;
            }
        }
        if(ok == 1){
            if( comp(a, x, b, y) ){
                copiere2(sola, a, x);
                copiere2(solb, b, y);
                xsol = x;
                ysol = y;
            }
        }
    }
    for(i = 1; i <= xsol; i++){
        fout<< sola[i];
    }
    fout<<"\n";
    for(i = 1; i <= ysol; i++){
        fout<< solb[i];
    }
    fout<<"\n";
    return 0;
}