Cod sursă (job #293447)

Utilizator avatar micutu Andrei Vasile Cont Fraudulent micutu IP ascuns
Problemă Fotografie (clasele 9-10) Compilator cpp | 1.95 kb
Rundă Arhiva de probleme Status evaluat
Dată 15 mar. 2017 11:34:36 Scor 100
#include <cstdio>
#include <algorithm>
#include <cstring>
#define Nmax 1002
#define mod 46103
#define b 26
using namespace std;
char a[Nmax][Nmax], B[Nmax][Nmax];
int s[Nmax], pbp, pbq, pbP, p, q, i, j, m, n, sum, val;
void ok(int x, int y)
{
    int i, j;
    for (i = x; i > x - p; -- i)
        for (j = y; j > y - q; -- j)
            if (a[i][j] != B[i - (x - p + 1)][j - (y - q + 1)])
                return ;
    printf("%d %d\n", x - p + 1, y - q + 1);
}
void read()
{
    scanf("%d %d\n", &n, &m);
    for (i = 0; i < n; ++ i)
        gets(a[i]);
    scanf("%d %d\n", &p, &q);
    for (i = 0; i < p; ++ i)
        gets(B[i]);

    for (j = 0; j < q; ++ j)
        for (i = 0; i < p; ++ i)
            sum = (sum * b + (B[i][j] - 'a')) % mod;
}
void solve()
{
    pbp = 1;
    pbq = 1;
    pbP = 1;
    for (i = 1; i < p; ++ i)
        pbp = (pbp * b) % mod;
    pbP = (pbp * b) % mod;
    for (i = 1; i < q; ++ i)
        pbq = (pbq * pbP) % mod;

    for (j = 0; j < m; ++ j)
        for (i = 0; i < p - 1; ++ i)
            s[j] = (s[j] * b + (a[i][j] - 'a')) % mod;
}
void write()
{
    for (i = p - 1; i < n; ++ i)
    {
        for (j = 0; j < m; ++ j)
            s[j] = (s[j] * b + (a[i][j] - 'a')) % mod;
        val = 0;
        for (j = 0; j < q - 1; ++ j)
            val = (val * pbP + s[j]) % mod;

        for (j = q - 1; j < m; ++ j)
        {
            val = (val * pbP + s[j]) % mod;
            if (val == sum)
                ok(i, j);
            val = ((val - pbq * s[j - q + 1]) % mod);
            if (val < 0)
                val += mod;
        }

        for (j = 0; j < m; ++ j)
        {
            s[j] = (s[j] - pbp * (a[i - p + 1][j] - 'a')) % mod;
            if (s[j] < mod)
                s[j] += mod;
        }
    }
}
int main()
{
    freopen("fotografie.in", "r", stdin);
    freopen("fotografie.out", "w", stdout);
    read();
    solve();
    write();
    return 0;
}