제출 #566271

#제출 시각아이디문제언어결과실행 시간메모리
566271two_sidesGenetics (BOI18_genetics)C++17
46 / 100
341 ms17484 KiB
#include <bits/stdc++.h>

using namespace std;

mt19937 rng(chrono::high_resolution_clock
::now().time_since_epoch().count());

const int N = 4005;
const int MOD = 1e9 + 9;

string s[N];
int n, m, k, num[N], sum[N][4];

int add(int x, int y) {
    return (x += y) >= MOD ? x - MOD : x;
}

int mul(int x, int y) {
    return (long long)x * y % MOD;
}

int sub(int x, int y) {
    return (x -= y) < 0 ? x + MOD : x;
}

int index(char c) {
    if (c == 'A') return 0;
    if (c == 'C') return 1;
    if (c == 'G') return 2;
    return 3;
}

int rand(int l, int r) {
    return uniform_int_distribution<int> (l, r)(rng);
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> m >> k;
    for (int i = 0; i < n; i++) {
        cin >> s[i]; num[i] = rand(0, MOD - 1);
        for (int j = 0; j < m; j++)
            sum[j][index(s[i][j])] = add
            (sum[j][index(s[i][j])], num[i]);
    }
    vector<int> can;
    for (int i = 0; i < n; i++) {
        int tmp = 0;
        for (int j = 0; j < m; j++)
            for (int c = 0; c < 4; c++)
                if (index(s[i][j]) != c)
                    tmp = add(tmp, sum[j][c]);
        for (int j = 0; j < n; j++)
            if (i != j) tmp = sub(tmp, mul(num[j], k));
        if (!tmp) cout << i + 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...