Cod sursă (job #546533)

Utilizator avatar mariabd Maria Burdila mariabd IP ascuns
Problemă Fotografie (clasele 9-10) Compilator cpp | 2.02 kb
Rundă lasm_19_03_2020_cl_12_a Status evaluat
Dată 19 mar. 2020 16:49:11 Scor 90
#include <fstream>
#include<bits/stdc++.h>
using namespace std;
ifstream fin ("fotografie.in");
ofstream fout ("fotografie.out");


int aa[1001], mx=1, my=1, mz=1, p, q, m, n, K, sm, val;
char a[1001][1001], b[1001][1001];

void rezolva(int x, int y){
	for (int i = x; i > x-p; --i)
        for (int j = y; j > y-q; --j)
            if (a[i][j] != b[i-(x-p+1)][j-(y-q+1)])
                return ;
    fout<<x-p+1<<' '<<y-q+1<<'\n';
}

int main()
{    
    fin >> n >> m;
    K=46103;
    for (int i = 0; i<n; ++i)fin>>a[i];
    fin >>p>>q;
    for (int i = 0; i < p; ++ i)fin >> b[i];
	for (int j = 0; j < q; ++ j)
        for (int i = 0; i < p; ++ i) sm = (sm * 26 + (b[i][j] - 'a')) % K;
    for (int i = 1; i < p; ++ i)mx = (mx * 26) % K;
    mz = (mx * 26) % K;
    for (int i = 1; i < q; ++ i)my = (my * mz) % K;

    for (int j = 0; j < m; ++ j)
        for (int i = 0; i < p - 1; ++ i)
            aa[j] = (aa[j] * 26 + (a[i][j] - 'a')) % K;

    for (int i = p - 1; i < n; ++ i)
    {
        for (int j = 0; j < m; ++ j)
            aa[j] = (aa[j] * 26 + (a[i][j] - 'a')) % K;

        val = 0;
        for (int j = 0; j < q - 1; ++ j)
            val = (val * mz + aa[j]) % K;

        for (int j = q - 1; j < m; ++ j)
        {
            val = (val * mz + aa[j]) % K;
            if (val == sm)rezolva(i, j);

            val = ((val - my * aa[j - q + 1]) % K);
            if (val < 0)val += K;
        }

        for (int j = 0; j < m; ++ j)
        {
            aa[j] = (aa[j] - mx * (a[i - p + 1][j] - 'a')) % K;
            if (aa[j] < K)aa[j] += K;
        }
    }

    return 0;
}