Mam zadanie w którym na wejściu dostaje 2 matrixy, jeden to labirynt a drugi to wzorzec, mam powiedzieć ile razy wzorzec występuje w labiryncie. Na wejściu dostajemy 4 liczby cx, cy, mx, my każda <= 1000, potem matrix o wymiarach cx na cy, następnie matrix o wymiarach my na mx. Na wyjściu mamy wypisać ile takich wzorów w labiryncie jest. Każda liczba w matrixie jest <= 100. Przykładowy test:
Wejście:
5 3 2 2
1 2 2 1 3
2 3 1 2 2
1 4 2 3 3
1 2
2 3

Wyjście:
2

Moje rozwiązanie to najpierw oblicznie hasha dla wzorca, później hash labiryntu który byłby sumą prefiksową 2D, a na koniec szukam wzorca w labiryncie. Mój program daje zbyt niskie wyniki np. zamiast 200 zwraca 10, dla dużych liczb (1000). Co robię źle?

#include <bits/stdc++.h>
    
using namespace std;
 
#define ll long long
#define ull unsigned long long
 
const ll MOD = 1e9 + 7, P = 1009, Q = 1013, MAXN = 1e3 + 7;
vector<ll> pow_of_p(MAXN), pow_of_q(MAXN);

void calc_pow_of_primes(){
    ll prime = 1;
    for (int i = 0; i < (int)pow_of_p.size(); i++){
        pow_of_p[i] = prime;
        prime = (prime * P) % MOD;
    }

    prime = 1;
    for (int i = 0; i < (int)pow_of_q.size(); i++){
        pow_of_q[i] = prime;
        prime = (prime * Q) % MOD;
    }
}

void solve(){
    calc_pow_of_primes();
    int cx, cy, mx, my;
    cin >> cx >> cy >> mx >> my;
    vector<vector<ll>> maze(cy, vector<ll>(cx));
    for (int i = 0; i < cy; i++)
        for (int j = 0; j < cx; j++)
            cin >> maze[i][j];
    
    ll hash_of_map = 0, color;
    for (int i = 0; i < my; i++){
        for (int j = 0; j < mx; j++){
            cin >> color;
            hash_of_map += (((color * pow_of_p[i]) % MOD) * pow_of_q[j]) % MOD;
        }
    }

    vector<vector<ll>> pref(cy+1, vector<ll>(cx+1));
    for (int i = 0; i < cy; i++){
        for (int j = 0; j < cx; j++){
            pref[i+1][j+1] = (MOD*5 + pref[i][j+1] + pref[i+1][j] - pref[i][j] + (((maze[i][j] * pow_of_p[i]) % MOD) * pow_of_q[j]) % MOD) % MOD;
        }
    }   

    int same = 0;
    for (int i = 0; i < cy - my + 1; i++){
        for (int j = 0; j < cx - mx + 1; j++){
            ll hash_of_maze = (MOD*5 + pref[i+my][j+mx] - pref[i][j+mx] - pref[i+my][j] + pref[i][j]) % MOD;
            ll change_hash_of_map = (((hash_of_map * pow_of_p[i]) % MOD) * pow_of_q[j]) % MOD; //żeby potęgi były takie same
            same += (hash_of_maze == change_hash_of_map);
        }
    }

    cout << same << "\n";
}   
 
     
void testcases(){
    int t;
    cin >> t;
    while(t){
        solve();
        t--;
    }
}
    
int main(){
    ios::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);
    //testcases();
    solve();
    return 0;
}

EDIT:
w tej linijce robiłem błąd:

hash_of_map += (((color * pow_of_p[i]) % MOD) * pow_of_q[j]) % MOD;

jeśli ktokolwiek to czyta to daje radę, NIGDY NIE MIESZAJ += I MODULO :)
powinno być

hash_of_map = (((((color * pow_of_p[i]) % MOD) * pow_of_q[j]) % MOD) + hash_of_map) % MOD;

i po tej zmianie wszytsko działa na 100% :D