Submission #397798

#TimeUsernameProblemLanguageResultExecution timeMemory
397798KoDGenetics (BOI18_genetics)C++17
100 / 100
970 ms34552 KiB
#include <bits/stdc++.h>

using i32 = std::int32_t;
using u32 = std::uint32_t;
using i64 = std::int64_t;
using u64 = std::uint64_t;
using i128 = __int128_t;
using u128 = __uint128_t;
using isize = std::ptrdiff_t;
using usize = std::size_t;

class rep {
    struct Iter {
        usize itr;
        constexpr Iter(const usize pos) noexcept : itr(pos) {}
        constexpr void operator++() noexcept { ++itr; }
        constexpr bool operator!=(const Iter& other) const noexcept {
            return itr != other.itr;
        }
        constexpr usize operator*() const noexcept { return itr; }
    };
    const Iter first, last;

  public:
    explicit constexpr rep(const usize first, const usize last) noexcept
        : first(first), last(std::max(first, last)) {}
    constexpr Iter begin() const noexcept { return first; }
    constexpr Iter end() const noexcept { return last; }
};

u64 xorshift() {
    static u64 state =
        std::chrono::system_clock::now().time_since_epoch().count();
    state ^= state << 7;
    state ^= state >> 9;
    return state;
}

template <class T> T rand_int(const T& min, const T& max) {
    static std::default_random_engine gen(xorshift());
    return std::uniform_int_distribution<T>(min, max)(gen);
}

template <class T> using Vec = std::vector<T>;

constexpr u64 MOD = ((u64)1 << 61) - 1;

constexpr u64 SUM(const u64 x, const u64 y) {
    const u64 t = x + y;
    return t >= MOD ? t - MOD : t;
}

constexpr u64 DIF(const u64 x, const u64 y) {
    const u64 t = x + MOD - y;
    return t >= MOD ? t - MOD : t;
}

constexpr u64 PROD(const u64 x, const u64 y) {
    u128 t = (u128)x * y;
    t = (t >> 61) + (t & MOD);
    return t >= MOD ? t - MOD : t;
}

void BOI18_Genetics_main() {
    usize N, M, K;
    std::cin >> N >> M >> K;
    Vec<Vec<char>> S(N, Vec<char>(M));
    for (auto& v : S) {
        for (auto& x : v) {
            std::cin >> x;
        }
    }
    Vec<u64> W(N);
    u64 whole = 0;
    for (auto& x : W) {
        x = rand_int<u64>(1, MOD - 1);
        whole = SUM(whole, x);
    }
    Vec<std::map<char, u64>> sum(M);
    for (const auto i : rep(0, N)) {
        for (const auto j : rep(0, M)) {
            auto& val = sum[j][S[i][j]];
            val = SUM(val, W[i]);
        }
    }
    for (const auto i : rep(0, N)) {
        u64 acc = PROD(whole, M);
        for (const auto j : rep(0, M)) {
            acc = DIF(acc, sum[j][S[i][j]]);
        }
        if (acc == PROD(DIF(whole, W[i]), K)) {
            std::cout << i + 1 << '\n';
            return;
        }
    }
}

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);
    BOI18_Genetics_main();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...