Submission #540321

#TimeUsernameProblemLanguageResultExecution timeMemory
540321skittles1412Genetics (BOI18_genetics)C++17
74 / 100
2064 ms58264 KiB
#pragma GCC optimize("Ofast,unroll-loops")
#pragma GCC target("avx2,popcnt")

#include "bits/extc++.h"

using namespace std;

template <typename T>
void dbgh(const T& t) {
	cerr << t << endl;
}

template <typename T, typename... U>
void dbgh(const T& t, const U&... u) {
	cerr << t << " | ";
	dbgh(u...);
}

#ifdef DEBUG
#define dbg(...)                                           \
	cerr << "L" << __LINE__ << " [" << #__VA_ARGS__ << "]" \
		 << ": ";                                          \
	dbgh(__VA_ARGS__)
#else
#define cerr   \
	if (false) \
	cerr
#define dbg(...)
#endif

#define endl "\n"
#define long int64_t
#define sz(x) int((x).size())

const int maxn = 4105;

int n, m, k;
char arr[maxn][maxn];

namespace s1 {

const string chars = "ACGT";
const long mod = 1e9 + 7;
bitset<maxn> arrb[maxn][4];

long hsh(int ind) {
	long h1 = 0, h2 = 0;
	for (int i = 0; i < m; i++) {
		h1 = (h1 * 7 + int(chars.find(arr[ind][i])) + 1) % mod;
		h2 = (h2 * 11 + int(chars.find(arr[ind][i])) + 1) % mod;
	}
	return h1 * mod + h2;
}

void solve() {
	mt19937 cowng(chrono::steady_clock::now().time_since_epoch().count());
	int ord[n], conv[n];
	bool bad[n] {}, checked[n][n] {};
	iota(ord, ord + n, 0);
	shuffle(ord, ord + n, cowng);
	int cind = 0;
	map<long, int> vis;
	for (auto& a : ord) {
		auto [it, inserted] = vis.emplace(hsh(a), cind);
		if (!inserted) {
			bad[it->second] = true;
			continue;
		}
		for (int c = 0; c < 4; c++) {
			for (int j = 0; j < m; j++) {
				if (arr[a][j] == chars[c]) {
					arrb[cind][c].set(j);
				}
			}
		}
		conv[cind] = a;
		cind++;
	}
	dbg(cind);
	k *= 2;
	for (int i = 0; i < cind; i++) {
		if (bad[i]) {
			continue;
		}
		for (int j = 0; j < cind; j++) {
			if (i == j || checked[i][j]) {
				continue;
			}
			int cnt = 0;
			for (int a = 0; a < 4; a++) {
				cnt += int((arrb[i][a] ^ arrb[j][a]).count());
				if (cnt > k) {
					break;
				}
			}
			checked[i][j] = checked[j][i] = true;
			if (cnt != k) {
				bad[j] = true;
				goto loop;
			}
		}
		cout << conv[i] + 1 << endl;
		return;
	loop:;
	}
}

}  // namespace s1

namespace s2 {

const int maxb = maxn;

bitset<maxb> arrb[maxb];

void solve() {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			if (arr[i][j] == 'A') {
				arrb[i].set(j);
			}
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (i != j) {
				int cnt = int((arrb[i] ^ arrb[j]).count());
				if (cnt != k) {
					goto loop;
				}
			}
		}
		cout << i + 1 << endl;
		return;
	loop:;
	}
}

}  // namespace s2

void solve() {
	cin >> n >> m >> k;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}
	bool b = true;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			b &= arr[i][j] == 'A' || arr[i][j] == 'C';
		}
	}
	if (b) {
		s2::solve();
	} else {
		s1::solve();
	}
}

int main() {
	cin.tie(nullptr);
	ios_base::sync_with_stdio(false);
	cin.exceptions(ios::failbit);
	solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...