Submission #1034588

#TimeUsernameProblemLanguageResultExecution timeMemory
1034588anangoGenetics (BOI18_genetics)C++17
27 / 100
99 ms3172 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;

mt19937 rng;
int INF = 1LL<<30;
int n,m,k;

int isvalid(int a, int b) {
    //is a/b close enough to k/m (statistically)
    if (b<100) return 1; //small sample size
    int maxdelta = sqrt(b)+2;
    maxdelta*=(b+m);
    int realdelta = abs(b*k-a*m); 
    return realdelta<=maxdelta;
}

int match(string &s1, string &s2) {
    int ct=0;
    for (int i=0; i<m; i++) {
        ct+=s1[i]!=s2[i];
        if (!isvalid(ct,i+1)) return -1;
    }
    return ct;
}

signed main() {
    /*#ifndef ONLINE_JUDGE
        // for getting input from input.txt
        freopen("input.txt", "r", stdin);
        // for writing output to output.txt
        freopen("output.txt", "w", stdout);
    #endif*/
    rng.discard(time(NULL)%1000);
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> m >> k;
    vector<string> ar(n);
    vector<int> order(n); 
    vector<int> sorder(m);
    vector<int> visited(n,0);
    for (int i=0; i<n; i++) {
        int r = (rng())%n;
        while (visited[r]) {
            r = rng()%n; 
            r+=rng(); 
            r%=n;
        }
        visited[r] = 1;
        order[i] = r;
        //assert(order[i]<n);
        //cout << i <<" " <<r << endl;
    }
    visited=vector<int>(m,0);
    for (int i=0; i<m; i++) {
        int r = (rng())%m;
        while (visited[r]) {
            r = rng()%m; 
            r+=rng(); 
            r%=m;   
        }
        visited[r] = 1;
        sorder[i] = r;  
        sorder[i] = i;
        //assert(order[i]<n);
        //cout << i <<" " <<r << endl;
    }

    for (int i=0; i<n; i++) {
        string s; cin >> s;
        vector<char> t(m); for (int j=0; j<m; j++) t[j] = s[sorder[j]];
        string r; for (auto j:t) r.push_back(j);
        ar[i] = r;
    }


    for (int i=0; i<n; i++) {
        int gg = 1;
        for (int j=0; j<n; j++) {
            if (order[i]==order[j]) continue;
            //assert(ar[order[j]].size()==m);
            if (match(ar[order[i]],ar[order[j]])!=k) {
                gg=0;
                break;
            }
        }
        if (gg) {
            cout << order[i]+1 << endl;
            break;
        }
    }
    
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...