Pagini recente » Cod sursa (job #2833305) | Cod sursa (job #1964481) | Cod sursa (job #895686) | Cod sursa (job #3210803) | Cod sursa (job #3188717)
#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;
}