Submission #762850

# Submission time Handle Problem Language Result Execution time Memory
762850 2023-06-21T21:19:58 Z PanosPask Osmosmjerka (COCI17_osmosmjerka) C++14
140 / 160
4000 ms 14284 KB
#include <bits/stdc++.h>
#define s second
#define f first

using namespace std;

typedef long long ll;
typedef __int128_t lll;

struct StringHash {

    ll MOD = (1ll << 61) - 1;
    int P = 31;

    vector<ll> hash;
    vector<ll> pow;

    void init(string& st) {
        hash.resize(st.size() + 1);
        pow.resize(st.size() + 1);

        hash[0] = 0;
        pow[0] = 1;
        for (int i = 0; i < st.size(); i++) {
            hash[i + 1] = ((lll)hash[i] * P + st[i] - 'a' + 1) % MOD;
            pow[i + 1] = (lll)pow[i] * P % MOD;
        }
    }

    ll get(int l, int len) {
        int r = l + len - 1;
        lll res = hash[r + 1] - (lll)hash[l] * pow[len] % MOD;

        return ((res % MOD) + MOD) % MOD;
    }
};

const int DIRS = 4;
const int d_i[4] = {1, 0, 1, 1};
const int d_j[4] = {0, 1, 1, -1};

int n, m, k;
vector<string> words;
int len;
vector<vector<bool>> visited;

vector<ll> all;

void generate_string(int or_i, int or_j, int d_i, int d_j)
{
    string beg;

    int cur = 0;
    int i = or_i;
    int j = or_j;
    // Create the string
    while (cur == 0 || (i != or_i) || (j != or_j)) {
        beg.push_back(words[i][j]);
        cur++;

        i += d_i;
        j += d_j;

        i = (i + m) % m;
        j = (j + n) % n;
    }

    string b2 = beg;
    reverse(b2.begin(), b2.end());

    string st = beg + beg;
    string st2 = b2 + b2;
    while (st.size() < cur + len - 1) {
        st = st + beg;
        st2 = st2 + b2;
    }
    // Hash the string and calculate it

    StringHash cur_hash;
    StringHash cur_hash2;
    cur_hash2.init(st2);
    cur_hash.init(st);

    i = or_i;
    j = or_j;
    cur = 0;
    while (!visited[i][j]) {
        all.push_back(cur_hash.get(cur, len));
        all.push_back(cur_hash2.get(cur, len));
        visited[i][j] = true;
        cur++;

        i = i + d_i;
        j = j + d_j;

        i = (i + m) % m;
        j = (j + n) % n;
    }
}

int main(void)
{
    ios::sync_with_stdio(false);

    cin >> m >> n >> k;

    len = min(n * m, k);

    words.resize(m);

    for (int i = 0; i < m; i++)
        cin >> words[i];

    for (int x = 0; x < DIRS; x++) {
        visited.assign(m, vector<bool>(n, false));

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (!visited[i][j])
                    generate_string(i, j, d_i[x], d_j[x]);
            }
        }
    }

    ll total_combo = (8 * n * m) * (ll)(8 * n * m);
    ll total_same = 0;

    sort(all.begin(), all.end());

    ll cur_num = -1;
    int cur_same = 0;
    for (int i = 0; i < all.size(); i++) {
        if (all[i] == cur_num)
            cur_same++;
        else {
            total_same += (ll)cur_same * cur_same;
            cur_num = all[i];
            cur_same = 1;
        }
    }
    total_same += (ll)cur_same * cur_same;

    ll d = __gcd(total_combo, total_same);

    total_combo /= d;
    total_same /= d;

    cout << total_same << '/' << total_combo << endl;

    return 0;
}

Compilation message

osmosmjerka.cpp: In member function 'void StringHash::init(std::string&)':
osmosmjerka.cpp:24:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 |         for (int i = 0; i < st.size(); i++) {
      |                         ~~^~~~~~~~~~~
osmosmjerka.cpp: In function 'void generate_string(int, int, int, int)':
osmosmjerka.cpp:73:22: warning: comparison of integer expressions of different signedness: 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   73 |     while (st.size() < cur + len - 1) {
      |            ~~~~~~~~~~^~~~~~~~~~~~~~~
osmosmjerka.cpp: In function 'int main()':
osmosmjerka.cpp:132:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  132 |     for (int i = 0; i < all.size(); i++) {
      |                     ~~^~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 2 ms 340 KB Output is correct
5 Correct 8 ms 596 KB Output is correct
6 Correct 50 ms 1376 KB Output is correct
7 Correct 1185 ms 8876 KB Output is correct
8 Execution timed out 4056 ms 14284 KB Time limit exceeded