Submission #949893

#TimeUsernameProblemLanguageResultExecution timeMemory
949893fuad27Genetics (BOI18_genetics)C++17
100 / 100
476 ms109704 KiB
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
const int N=4200;
mt19937 rng(chrono::steady_clock().now().time_since_epoch().count());
bitset<N> b[N][2];
int cnt[N][4];
int dif[N][N];
int diff(int i, int j) {
  if(dif[i][j]>=0)return dif[i][j];
  return dif[i][j]=((b[i][0]^b[j][0])|(b[i][1]^b[j][1])).count();
}
int main () {
  cin.tie(0)->sync_with_stdio(0);
  int n, m, k;
  cin >> n >> m >> k;
  memset(dif, -1, sizeof dif);
  string a[n];
  for(int i =0 ;i<n;i++) {
    cin >> a[i];
    for(int j =0 ;j<m;j++) {
      if(a[i][j]=='A') {
        b[i][0][j]=b[i][1][j]=1;
        cnt[j][0]++;
      }
      else if(a[i][j]=='C') {
        b[i][0][j]=1;
        b[i][1][j]=0;
        cnt[j][1]++; 
      }
      else if(a[i][j]=='G') {
        b[i][0][j]=0;
        b[i][1][j]=1;
        cnt[j][2]++;
      }
      else{
        cnt[j][3]++;
      }
    }
  }
  bool check[n];
  memset(check, 0, sizeof check);
  int cc=0;
  vector<int> idd(n);
  iota(idd.begin(), idd.end(), 0);
  shuffle(idd.begin(), idd.end(), rng);
  for(int i:idd) {
    int sum=0;
    for(int j = 0;j<m;j++) {
      if(a[i][j]=='A')sum+=cnt[j][0]-1;
      else if(a[i][j]=='C')sum+=cnt[j][1]-1;
      else if(a[i][j]=='G')sum+=cnt[j][2]-1;
      else sum+=cnt[j][3]-1;
    }
    if(sum==(m-k)*(n-1)) {
      cc++;
      bool ck=1;
      for(int j:idd) {
        if(j==i)continue;
        if(diff(i,j)!=k) {
          ck=false;
          break;
        }
      }
      if(ck) {
        cout << i+1 << "\n";
        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...