제출 #1242688

#제출 시각아이디문제언어결과실행 시간메모리
1242688tolbi메시지 (IOI24_message)C++20
100 / 100
396 ms848 KiB
#include "message.h"
#include <bits/stdc++.h>
using namespace std;
void send_message(std::vector<bool> M, std::vector<bool> C) {
	for (int i = 0; i < 31; ++i)
	{
		C[i] = !C[i];
	}
	int message_size = M.size();
	M.resize(1025);
	M[message_size] = true;
	int ind = 0;
	for (int i = 0; i < 31; i++){
		vector<bool> A(31);
		int j = i-1;
		if (j < 0) j = 30;
		while (C[j] == false){
			j--;
			if (j < 0) j = 30;
		}
		A[j] = C[i];
		for (int k = 0; k < 31; k++){
			if (k == j) continue;
			if (C[k]) A[k] = M[ind++];
		}
		send_packet(A);
	}
	for (int i = 31; i < 66; i++){
		vector<bool> A(31);
		for (int k = 0; k < 31; k++){
			if (C[k]) A[k] = M[ind++];
		}
		send_packet(A);
	}
}

std::vector<bool> receive_message(std::vector<std::vector<bool>> R) {
	vector<bool> C(31,false);
	for (int x = 0; x < 31; x++){
		vector<int> trust;
		int i = x;
		trust.push_back(i);
		vector<bool> vis(31, false);
		vis[i] = true;
		for (int _ = 0; _ < 15; _++){
			for (int j = 1; j < 31; j++){
				if (vis[(trust.back()+j)%31]) continue;
				if (R[(trust.back()+j)%31][trust.back()] == 1){
					vis[(trust.back()+j)%31] = true;
					trust.push_back((trust.back()+j)%31);
					break;
				}
			}
		}
		if (trust.size() == 16 && R[trust[0]][trust.back()]){
			for (auto it : trust){
				C[it] = 1;
			}
			bool boolean=true;
			for (int i = 0; i < 31; i++){
				int j = i-1;
				if (j < 0) j = 30;
				while (C[j] == 0){
					j--;
					if (j < 0) j = 30;
					if (i == j) break;
				}
				if (i == j){
					boolean=false;
					break;
				}
				if (R[i][j] != C[i]){
					boolean=false;
					break;
				}
			}
			if (!boolean){
				for (auto it : trust){
					C[it] = 0;
				}
				continue;
			}
			break;
		}
	}
	vector<bool> ret;
	for (int i = 0; i < 31; i++){
		int j = i-1;
		if (j < 0) j = 30;
		while (C[j] == false){
			j--;
			if (j < 0) j = 30;
		}
		for (int k = 0; k < 31; k++){
			if (k == j) continue;
			if (C[k]) ret.push_back(R[i][k]);
		}
	}
	for (int i = 31; i < 66; i++){
		for (int k = 0; k < 31; k++){
			if (C[k]) ret.push_back(R[i][k]);
		}
	}
	while (ret.back() == false) ret.pop_back();
	ret.pop_back();
	return ret;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...