Cod sursa(job #3188717)

Utilizator stefanrotaruRotaru Stefan-Florin stefanrotaru Data 3 ianuarie 2024 18:45:58
Problema Problema rucsacului Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <cstring>
#include <string>

using namespace std;

ifstream f("blis.in");
ofstream g("blis.out");

int k, val[100005][35], dp[100005], adaug[100005][35];

int ans = 0;

int maxi = 0;

char a[1000005];

void task1()
{
    for (int i = 0; i <= (int) strlen(a); ++i) {
        int nr = 0;

        for (int j = i; j - i < k  && j < (int) strlen(a); ++j) {
            nr = nr * 2 + (a[j] - '0');
            val[i][j] = nr;
            maxi = max(maxi, nr);
        }

        dp[i] = 100000000;
    }

    g << maxi << '\n';
}

int cautareBinara(int val)
{
    int ans = 0;

    for (int step = (1 << 16); step; step >>= 1) {
        if (ans + step <= ans && dp[ans + step] < val) {
            ans += step;
        }
    }

    return (ans + 1);
}

int main()
{
    f >> k >> a;

    task1();

    dp[0] = -100000000;

    int n = strlen(a);

    for (int i = 0; i <= n; ++i) {
        for (int j = 0; j < min(k, n - i); ++j) {
            adaug[i + j][j] = cautareBinara(val[i][j]);
            g << adaug[i][j] << ' ';
        }

        for (int j = 0; j < min(k, i); ++j) {
            ans = max(ans, adaug[i][j]);
            dp[adaug[i][j]] = min(adaug[i][j], val[i - j][j]);
        }
    }

    g << ans;

    return 0;
}