Pagini recente » Cod sursa (job #3041005) | Cod sursa (job #1206221) | Cod sursa (job #2094122) | Cod sursa (job #1297654) | Cod sursa (job #139047)
Cod sursa(job #139047)
#include <stdio.h>
#define NMax 3200005
int N, M, fib[32], wh;
char S[NMax], D[2][131072];
int check(int lA, int lB)
{
int i, ind = 0, cuv = 0, start[2], fin[2];
if (N % 2)
start[0] = 0, start[1] = lA, fin[0] = lA, fin[1] = lA+lB;
else
start[0] = lB, start[1] = 0, fin[0] = lB, fin[1] = lA+lB;
for (i = 0; i < M; ++i, ++ind)
{
if (ind == fin[0] || ind == fin[1])
ind = start[D[wh][++cuv]-'A'];
if (S[ind] != S[i])
return 0;
}
return 1;
}
int main(void)
{
int i, j, k, crt = 0, prev = 1;
freopen("lampa.in", "r", stdin);
freopen("lampa.out", "w", stdout);
scanf("%d %d\n", &N, &M);
fgets(S, sizeof(S), stdin);
D[0][0] = 'A'; D[1][0] = 'B';
fib[0] = fib[1] = 1;
for (i = 2; i < N; i++)
{
crt = (i & 1); prev = (!crt);
fib[i] = fib[i-1] + fib[i-2];
for (j = 0; j < fib[i-1]; j++)
D[crt][fib[i-2]+j] = D[prev][j];
}
wh = crt;
for (i = 1; i * fib[N-3] < M; i++)
{
if ((M - i * fib[N-3]) % fib[N-2]) continue;
j = (M - i * fib[N-3]) / fib[N-2];
if (check(i, j))
break;
}
if (i * fib[N-3] >= M)
{
printf("0\n");
return 0;
}
if (N % 2)
{
for (k = 0; k < i; k++)
printf("%c", S[k]);
printf("\n");
for (k = i; k < i+j; k++)
printf("%c", S[k]);
printf("\n");
}
else
{
for (k = j; k < i+j; k++)
printf("%c", S[k]);
printf("\n");
for (k = 0; k < j; k++)
printf("%c", S[k]);
printf("\n");
}
return 0;
}