Cod sursa(job #1624409)

Utilizator krityxAdrian Buzea krityx Data 2 martie 2016 10:50:58
Problema Secventa Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

void read(char *&p, int &val)
{
	val = 0;
	bool sign = false;
	while (*p == ' ' || *p == '\n')
	{
		p++;
	}
	while (*p >= '0' && *p <= '9')
	{
		val = val * 10 + (*p - '0');
		p++;
	}
}

int main()
{
	char *s = new char[10 * 1024 * 1024];
	int N, i, j, x;
	vector<int> count; //count[i] = nr matrici ixi
	vector<vector<bool>> M;
	vector<vector<int>> left, up, sol;

	ifstream f("custi.in");
	f.read(s, 10 * 1024 * 1024);
	size_t bytesRead = f.gcount();

	char *p = s;

	read(p, N);
	//f >> N;

	M.resize(N + 1);
	count.resize(N + 1, 0);
	sol.resize(N + 1);
	left.resize(N + 1);
	up.resize(N + 1);
	M[0].resize(N + 1);
	up[0].resize(N + 1);
	left[0].resize(N + 1);
	sol[0].resize(N + 1, 0);
	for (i = 1; i <= N; i++)
	{
		M[i].resize(N + 1);
		left[i].resize(N + 1, 0);
		up[i].resize(N + 1, 0);
		sol[i].resize(N + 1, 0);
		for (j = 1; j <= N; j++)
		{
			read(p, x);
			M[i][j] = (x == 1 ? true : false);
			left[i][j] = (M[i][j - 1] ? left[i][j - 1] + 1 : 0);
			up[i][j] = (M[i - 1][j] ? up[i - 1][j] + 1 : 0);

			if (M[i][j])
			{
				sol[i][j] = min(left[i][j], min(up[i][j], sol[i - 1][j - 1])) + 1;
				int k = sol[i][j];
				while (k > 0)
				{
					count[k--]++;
				}
			}
		}
	}
	f.close();

	ofstream g("custi.out");
	for (i = 1; i <= N; i++)
	{
		g << count[i] << "\n";
	}
	g.close();
	return 0;
}