Cod sursa(job #1327360)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 26 ianuarie 2015 17:28:09
Problema A+B Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
// 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;
}