Submission #1247886

#TimeUsernameProblemLanguageResultExecution timeMemory
1247886Abdo_EidOsmosmjerka (COCI17_osmosmjerka)C++20
80 / 160
4098 ms327680 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 5e2 + 1;
int n, m, k;
char grid[N][N];
const int dr[] = {1, 1, 1, 0, 0, -1, -1, -1};
const int dc[] = {1, -1, 0, 1, -1, 1, -1, 0};

string get_path(int r, int c, int d) {
    string res;
    for (int step = 0; step < k; step++) {
        res += grid[r][c];
        r = (r + dr[d] + n) % n;
        c = (c + dc[d] + m) % m;
    }
    return res;
}

struct Hash {
    const int M = 1e9 + 9;
    const int P = 9973;
    int n;
    vector<ll> pw, hsh;

    ll mul(ll a, ll b) { return (a * b) % M; }
    ll add(ll a, ll b) { return (a + b) % M; }
    ll sub(ll a, ll b) { return (a - b + M) % M; }

    Hash(string s) {
        n = s.size();
        pw.resize(k + 1);  // Precompute up to k
        hsh.resize(n + 1);
        pw[0] = 1;
        hsh[0] = 0;
        for (int i = 1; i <= n; i++) {
            pw[i] = mul(pw[i - 1], P);
            hsh[i] = add(s[i - 1], mul(hsh[i - 1], P));
        }
        for (int i = n + 1; i <= k; i++) {
            pw[i] = mul(pw[i - 1], P);
        }
    }

    ll get(int l, int r) {
        return sub(hsh[r + 1], mul(hsh[l], pw[r - l + 1]));
    }

    ll merge(ll lval, ll rval, int rsize) {
        return add(rval, mul(lval, pw[rsize]));
    }

    ll getByStart(int i) {
        return merge(get(i, n - 1), get(0, i - 1), n - i);
    }
};

void solve() {
    cin >> n >> m >> k;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> grid[i][j];

    map<ll, ll> mp;
    for (int r = 0; r < n; r++) {
        for (int c = 0; c < m; c++) {
            for (int d = 0; d < 8; d++) {
                string s = get_path(r, c, d);
                Hash hsh(s);
                ll full_hash = hsh.get(0, k - 1);
                mp[full_hash]++;
            }
        }
    }

    ll den = (1ll * n * m * 8) * (1ll * n * m * 8);
    ll num = 0;
    for (auto& [hash, cnt] : mp) {
        num += 1ll * cnt * cnt;
    }

    if (num == 0) {
        cout << "0/1" << endl;
    } else {
        ll GCD = gcd(num, den);
        cout << num / GCD << "/" << den / GCD << endl;
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int t = 1;
    while (t--) solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...