Pagini recente » Cod sursa (job #289551) | Cod sursa (job #2575042) | Cod sursa (job #3153172) | Cod sursa (job #1321482) | Cod sursa (job #1327360)
// blis
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
#define NMax 100002
#define KMax 32
#define ch(a) (a-'0')
using namespace std;
ifstream f("blis.in");
ofstream g("blis.out");
int k;
string in;
int dp[NMax][KMax];
int l[NMax][KMax];
inline int maxim(int a, int b) {
if (a > b)
return a;
return b;
}
inline int minim(int a, int b) {
if (a < b)
return a;
return b;
}
void read() {
f>>k;
f>>in;
}
void solveFirst() {
int left = 0, right = k-1;
int x = 0;
int answ;
for (int i=left;i<=right;i++) {
x <<= 1;
x+=ch(in[i]);
}
answ = x;
for (;right < in.size()-1;left++,right++) {
if (in[left] == '1')
x = x - (1<<(k-1));
if (in[right+1] == '1') {
x <<= 1;
x++;
} else {
x <<= 1;
}
answ = maxim(answ, x);
}
g<<answ<<'\n';
}
void solveSecond() {
memset(l, 0, sizeof(l));
memset(dp, -1, sizeof(dp));
int len = in.size();
dp[len-1][1] = ch(in[len-1]);
l[len-1][1] = 1;
for (int i=len-2;i>=0;i--) {
int x = 0;
for (int j=1;j<=k && i+j <= len;j++) {
x <<= 1;
x+=ch(in[i+j-1]);
int poz = -1;
int optimalLen = 0;
int future=i+k;
for (int p=1;p<=k;p++) {
if (x < dp[future][p] && l[future][p] > 0) {
if (optimalLen < l[future][p]) {
poz = p;
optimalLen = l[future][p];
}
}
}
dp[i][j] = x;
if (poz != -1) {
l[i][j] = 1+optimalLen;
} else {
l[i][j] = 0;
}
}
}
int answ = 0;
for (int i=1;i<=k;i++) {
answ = maxim(answ, l[0][i]);
}
g<<answ<<'\n';
}
int main() {
read();
solveFirst();
solveSecond();
f.close(); g.close();
return 0;
}