제출 #1276160

#제출 시각아이디문제언어결과실행 시간메모리
1276160not_amirGenetics (BOI18_genetics)C++20
100 / 100
767 ms24384 KiB
#include <bits/stdc++.h>
using namespace std;

constexpr int MAXN = 4105;

int dtoi(char c) {
    if (c == 'A')
        return 0;
    if (c == 'G')
        return 1;
    if (c == 'C')
        return 2;
    if (c == 'T')
        return 3;
    exit(-1);
}

char itod(int x) {
    return "AGCT"[x];
}

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int n, m, k;
    cin >> n >> m >> k;
    vector<string> C(n);
    vector<bitset<MAXN>> b0(n), b1(n);
    vector<vector<int>> cnt(m, vector<int>(4));
    for (string &s : C) {
        cin >> s;
        for (int i = 0; i < m; i++) {
            cnt[i][dtoi(s[i])]++;
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            b0[i][j] = dtoi(C[i][j]) & 1;
            b1[i][j] = dtoi(C[i][j]) >> 1 & 1;
        }
    }
    random_device rd;
    mt19937_64 g(rd());
    vector<int> p(n);
    iota(p.begin(), p.end(), 0);
    shuffle(p.begin(), p.end(), g);
    auto ok = [&](int i) {
        for (int j : p) {
            if (j != i && (b0[i] ^ b0[j] | b1[i] ^ b1[j]).count() != k)
                return false;
        }
        return true;
    };
    for (int i : p) {
        int s = 0;
        for (int j = 0; s <= (n - 1) * k && j < m; j++) {
            for (int l = 0; l < 4; l++) {
                if (l != dtoi(C[i][j]))
                    s += cnt[j][l];
            }
        }
        if (s != (n - 1) * k)
            continue;
        if (ok(i)) {
            cout << i + 1;
            return 0;
        }
    }
    cout << -1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...