제출 #984484

#제출 시각아이디문제언어결과실행 시간메모리
984484Mizo_CompilerGenetics (BOI18_genetics)C++17
100 / 100
388 ms36608 KiB
#include <bits/stdc++.h>
using namespace std;
#pragma GCC target("popcnt")
typedef long long ll;
#define pb push_back
#define F first
#define S second
#define all(x) x.begin(),x.end()
#define sz(x) int(x.size())
const int N = 4100, M[] = {int(1e9+7), 998244353}, B = 2;
const ll P[] = {4, 5};
int n, m, k, id[30];
ll pw[N][B], sum[B], val[N][B], cnt[N][4][B];
string s[N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> m >> k;
    id[int('A'-'A')] = 0;
    id[int('G'-'A')] = 2;
    id[int('T'-'A')] = 3;
    id[int('C'-'A')] = 1;
    for (int i = 0; i < B; i++) {
        pw[0][i] = 1;
        for (int j = 1; j < N; j++) {
            pw[j][i] = (pw[j-1][i] * P[i]) % M[i];
        }
    }
    for (int i = 0; i < n; i++) {
        cin >> s[i];
        for (int j = 0; j < m; j++) {
            for (int kk = 0; kk < B; kk++) {
                val[i][kk] += (ll(id[int(s[i][j]-'A')]+1) * pw[j][kk]) % M[kk];
                if (val[i][kk] >= M[kk])val[i][kk] -= M[kk];
            }
        }
        for (int j = 0; j < m; j++) {
            for (int kk = 0; kk < B; kk++) {
                cnt[j][id[int(s[i][j]-'A')]][kk] += val[i][kk];
                if (cnt[j][id[int(s[i][j]-'A')]][kk] >= M[kk])cnt[j][id[int(s[i][j]-'A')]][kk] -= M[kk];
            }
        }
        for (int j = 0; j < B; j++) {
            sum[j] += val[i][j];
            if (sum[j] >= M[j])sum[j] -= M[j];
        }
    }
    for (int i = 0; i < n; i++) {
        ll sm[B] = {0, 0}, sm2[B] = {0, 0};
        for (int j = 0; j < B; j++) {
            sm[j] = sum[j] - val[i][j];
            if (sm[j] < 0)sm[j] += M[j];
            sm[j] = (sm[j] * ll(m-k)) % M[j];
        }
        bool f = true;
        for (int j = 0; j < m; j++) {
            for (int kk = 0; kk < B; kk++) {
                sm2[kk] += cnt[j][id[int(s[i][j]-'A')]][kk];
                if (sm2[kk] >= M[kk])sm2[kk] -= M[kk];
                sm2[kk] -= val[i][kk];
                if (sm2[kk] < 0)sm2[kk] += M[kk];
            }
        }
        for (int j = 0; j < B; j++) {
            f &= (sm[j] == sm2[j]);
        }
        if (f) {
            cout << i+1;
            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...