Pagini recente » Cod sursa (job #2054001) | Cod sursa (job #3252097) | Cod sursa (job #465261) | Cod sursa (job #2062801) | Cod sursa (job #135650)
Cod sursa(job #135650)
Utilizator |
Mircea Pasoi domino |
Data |
14 februarie 2008 02:17:21 |
Problema |
Lampa |
Scor |
Ascuns |
Compilator |
cpp |
Status |
done |
Runda |
|
Marime |
1.35 kb |
#include <stdio.h>
#include <string>
using namespace std;
#define FIN "lampa.in"
#define FOUT "lampa.out"
#define MAX_N 20
#define MAX_S 4000000
#define sz(x) ((int)(x).size())
int N, M; char s[MAX_S];
string S, F[MAX_N], bstA, bstB;
int works(const char a[], const char b[])
{
int i, p = 0, n = strlen(a), m = strlen(b);
for (i = 0; i < sz(F[N]); ++i)
if (F[N][i] == 'A')
{
if (memcmp(s+p, a, n)) return 0;
p += n;
}
else
{
if (memcmp(s+p, b, m)) return 0;
p += m;
}
return 1;
}
int main(void)
{
int i, j, a, b;
string A, B;
freopen(FIN, "r", stdin);
freopen(FOUT, "w", stdout);
scanf("%d %d %s", &N, &M, s);
S = s;
F[1] = "A"; F[2] = "B";
for (i = 3; i <= N; ++i)
F[i] = F[i-2]+F[i-1];
a = sz(F[N-2]); b = sz(F[N-1]);
for (i = 1; i*a <= M; ++i)
{
j = M-i*a;
if (j%b) continue;
j /= b;
if (i+j > sz(S)) continue;
A = N&1 ? S.substr(0, i) : S.substr(j, i);
B = N&1 ? S.substr(i, j) : S.substr(0, j);
if (!works(A.c_str(), B.c_str())) continue;
if (bstA == "" || bstA > A)
bstA = A, bstB = B;
}
printf("%s\n%s\n", bstA.c_str(), bstB.c_str());
return 0;
}