제출 #952787

#제출 시각아이디문제언어결과실행 시간메모리
952787badontGenetics (BOI18_genetics)C++17
100 / 100
340 ms102512 KiB
#include <bits/stdc++.h>
using namespace std;

// clang-format off
template <typename T, typename = void> struct is_iterable : false_type {};template <typename T>struct is_iterable<    T, void_t<decltype(begin(declval<T>())), decltype(end(declval<T>()))>>    : true_type {};template <typename T>typename enable_if<is_iterable<T>::value && !is_same<T, string>::value,ostream &>::type operator<<(ostream &cout, T const &v);template <typename A, typename B>ostream &operator<<(ostream &cout, pair<A, B> const &p) {  return cout << "(" << p.first << ", " << p.second << ")";}template <typename T>typename enable_if<is_iterable<T>::value && !is_same<T, string>::value, ostream &>::type operator<<(ostream &cout, T const &v) {  cout << "[";  for (auto it = v.begin(); it != v.end();) {cout << *it; if (++it != v.end()) cout << ", ";  } return cout << "]";}

#ifdef LOCAL
  void dbg_out() { cout << endl; } template <typename Head, typename... Tail> void dbg_out(Head H, Tail... T) { cout << ' ' << H; dbg_out(T...); }
  #define debug(...) cout << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
#else
  #define debug(...) "zzz"
#endif
// clang-format on

using ll = long long;
using ld = long double;
using pii = pair<ll, ll>;

#define all(x) x.begin(), x.end()
#define mp make_pair
#define pb push_back
#define f first
#define s second

using hash_t = uint64_t;

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

void solve() {
  // open
  int n, m, k;
  cin >> n >> m >> k;

  vector<hash_t> h(n);
  for (auto &u : h)
    u = rng();

  hash_t sum = accumulate(all(h), hash_t(0));

  vector<string> inp(n);
  for (auto &row : inp)
    cin >> row;

  vector a(n, vector<int>(m, -1));
  for (int row = 0; row < n; row++) {
    for (int col = 0; col < m; col++) {
      switch (inp[row][col]) {
      case 'A':
        a[row][col] = 0;
        break;
      case 'G':
        a[row][col] = 1;
        break;
      case 'T':
        a[row][col] = 2;
        break;
      case 'C':
        a[row][col] = 3;
        break;
      }
    }
  }

  vector f(m, vector<hash_t>(4, 0));

  for (int i = 0; i < n; i++) {
    for (int col = 0; col < m; col++) {
      f[col][a[i][col]] += h[i];
    }
  }

  for (int cand = 0; cand < n; cand++) {
    hash_t expected_sum = (sum - h[cand]) * k;
    hash_t agg_sum = 0;
    for (int col = 0; col < m; col++) {
      for (int z = 0; z < 4; z++) {
        if (z == a[cand][col])
          continue;
        agg_sum += f[col][z];
      }
    }
    if (agg_sum == expected_sum) {
      cout << cand + 1 << "\n";
      return;
    }
  }

  assert(false);
}

int main() {
  cin.tie(0)->sync_with_stdio(false);

  ll T = 1;
  // cin >> T;
  for (int t = 0; t < T; t++)
    solve();

  cout.flush();
  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...