Cod sursă (job #365211)

Utilizator avatar AndriiPopa Vlad Vas AndriiPopa IP ascuns
Problemă Fotografie (clasele 9-10) Compilator cpp | 1,45 kb
Rundă Arhiva de probleme Status evaluat
Dată 14 mar. 2018 13:00:17 Scor 0
#include <fstream>
#include <set>
#include <stack>

#include <iostream>

using namespace std;

int M, N;
int m, n;
char F[1000][1000], f[1000][1000];

ifstream in("fotografie.in");
ofstream out("fotografie.out");

void findAppearances(int line, int toFind, set<int> &result)
{
	set<int> toProcess;
	stack<int> toRemove;
	int c[1001];
	for (int j = 0; j < N; j++)
	{
		if (F[line][j] == f[toFind][0]) { toProcess.insert(j); c[j] = 0; }

		for (int k : toProcess)
		{
			if (F[line][k + c[k]] == f[toFind][c[k]]) c[k]++;
			else toRemove.push(k);

			if (c[k] == n)
			{
				result.insert(k);
				toRemove.push(k);
			}
		}
		while (!toRemove.empty()) { toProcess.erase(toRemove.top()); toRemove.pop(); }
	}

}

int main()
{
	in >> M >> N;
	for (int i = 0; i < M; i++)
		for (int j = 0; j < N; j++)
			in >> F[i][j];

	in >> m >> n;
	for (int i = 0; i < m; i++)
		for (int j = 0; j < n; j++)
			in >> f[i][j];

	set<int> S, R;
	stack<int> toRemove;
	int c[1000];
	for (int i = 0; i < M; i++)
	{
		findAppearances(i, 0, R);

		for(int k : R)
		{
			c[k] = 0;
			S.insert(k);
		}
		R.clear();

		for (int k : S)
		{
			findAppearances(i, c[k], R);

			if (R.find(k) != R.end()) { c[k]++; }
			else toRemove.push(k);

			if (c[k] == m)
			{
				out << i - m + 1 <<' '<< k <<'\n';
				toRemove.push(k);
			}

			R.clear();
		}

		while (!toRemove.empty()) { S.erase(toRemove.top()); toRemove.pop(); }
	}



}