제출 #395167

#제출 시각아이디문제언어결과실행 시간메모리
395167wenqiGenetics (BOI18_genetics)C++14
27 / 100
2097 ms317704 KiB
#include <bits/stdc++.h>

using namespace std;

int N, M, K;

#define P1 30881
#define P2 54877ll

char dna[4169][4169];

using H = uint32_t;

H coef[4169];

struct W {
	unordered_set<int> side;
	H hash;

	void c() {
		hash = 0;
		for (int i : side) {
			hash = (hash + coef[i]) % P2;
		}
	}
};

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> M >> K;

	coef[0] = 1;
	for(int i = 1; i <= N; i++) {
		cin >> dna[i];
		coef[i] = (coef[i - 1] * P1) % P2;
	}

	vector<pair<W, W>> bins;

	for(int i = 0; i < M; i++) {
		vector<int> buckets[256];
		for(int j = 1; j <= N; j++) {
			int w = dna[j][i];
			buckets[w].push_back(j);
		}
		const char* R = "ACGT";
		for (int ii = 0; ii < 4; ii++) {
			for(int iii = ii + 1; iii < 4; iii++) {
				auto& A = buckets[R[ii]];
				auto& B = buckets[R[iii]];

				W a, b;
				a.side = {A.begin(), A.end()};
				b.side = {B.begin(), B.end()};
				a.c();
				b.c();
				bins.push_back({a, b});
			}
		}
	}

	for (int i = 1; i <= N; i++) {
		H needed = 0;

		for(int j = 1; j <= N; j++) {
			if(i == j) continue;
			needed = (needed + coef[j] * K) % P2;
		}

		H T = 0;

		for(auto p : bins) {
			if(p.first.side.find(i) != p.first.side.end()) {
				T += p.second.hash;
			}else if(p.second.side.find(i) != p.second.side.end()) {
				T += p.first.hash;
			}
			T %= P2;
		}

#ifdef DEBUG
		cerr << T << ' ' << needed << '\n';
#endif

		if(T == needed) {
			cout << i << '\n';
			return 0;
		}
	}
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

genetics.cpp: In function 'int main()':
genetics.cpp:51:27: warning: array subscript has type 'char' [-Wchar-subscripts]
   51 |     auto& A = buckets[R[ii]];
      |                       ~~~~^
genetics.cpp:52:28: warning: array subscript has type 'char' [-Wchar-subscripts]
   52 |     auto& B = buckets[R[iii]];
      |                       ~~~~~^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...