Pagini recente »
2022-03-03-clasa-6-concurs12-cursuri-performanta
|
Istoria paginii runda/c22_6/clasament
|
Rating Vlad Ghetina (VladGhetina)
|
2024-01-19-clasa-5-tema-21
|
Cod sursă (job #365211)
Cod sursă (job
#365211)
#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(); }
}
}