Pagini recente » Borderou de evaluare (job #142912) | Cod sursa (job #2033781) | Cod sursa (job #550155) | Cod sursa (job #385806) | Cod sursa (job #2329183)
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;
ifstream f("blis.in");
ofstream g("blis.out");
const int nmax = 100005;
const int oo = 2e9;
int k, n, i, j, nr, maxim, poz, lft, rgt, m;
char s[nmax];
vector<pair<int, int> > V[nmax];
int vec[nmax];
int cb(int x)
{
int st = 1, dr = m, mij;
while (st <= dr)
{
mij = (st+dr)/2;
if (vec[mij] >= x)
dr = mij-1;
else st = mij+1;
}
return st;
}
int main()
{
f >> k >> s+1;
n = strlen(s+1);
for (i = 1; i <= n; i++)
vec[i] = oo;
vec[0] = -oo;
for (i = 1; i <= n; i++)
{
nr = 0;
for (j = i; j < i+k and j <= n; j++)
{
nr = nr*2+s[j]-'0';
if (maxim < nr)
{
maxim = nr;
}
poz = cb(nr);
V[j].push_back(make_pair(poz, nr));
}
int N = V[i].size();
pair<int,int> aux;
for (j = 0;j<N;j++)
{
aux = V[i][j];
if (vec[aux.first] > aux.second)
{
vec[aux.first] = aux.second;
if (aux.first > m)
m++;
}
}
}
g << maxim << '\n' << m;
return 0;
}