| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 829723 | Essa2006 | Data Transfer (IOI19_transfer) | C++14 | 0 ms | 0 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
//#include "transfer.h"
#include<bits/stdc++.h>
 
using namespace std;
 
vector<int> get_attachment(vector<int> source) {
    vector<int>Ans;
	for(int j=0;j<=9;j++){
        int cur=(1<<j);
        int res=0;
        bool cont=0;
        for(int i=0;i<source.size();i++){
            if(i&cur){
                cont=1;
                res^=source[i];
            }
        }
        if(!cont)
            continue;
        Ans.push_back(res);
	}
	Ans.push_back(source.front());
	return Ans;
}
 
vector<int> retrieve(vector<int> data) {
	int ind=0;
	int n=63;
	if(data.size()>200){
        n=255;
	}
	vector<int>Cur(n);
	for(int j=0;j<=9;j++){
        int cur=(1<<j);
        int res=0;
        bool cont=0;
        for(int i=0;i<n;i++){
            if(i&cur){
                cont=1;
                res^=data[i];
            }
        }
        if(!cont)
            continue;
        Cur.push_back(res);
	}
	for(int i=n;i<data.size()-1;i++){
        if(Cur[i]!=data[i]){
            ind+=(1<<(i-n));
        }
	}
	vector<int>Ans;
	for(int i=0;i<n;i++){
        Ans.push_back(data[i]);
	}
	if(ind || (ind==0 && data.back()!=Ans.front())){
        Ans[ind]=!Ans[ind];
	}
	return Ans;
}
 
static inline string run_scenario() {
	int c;
	cin >> c;
	if (c < -1)
		return "invalid corruption index";
	string source_str;
	cin >> source_str;
	const int N = source_str.size();
	const int max_attachment_size = 2*N;
	vector<int> source;
	for (int i=0; i<N; i++)
		source.push_back(source_str[i]-'0');
	vector<int> attachment = get_attachment(source);
	if (int(attachment.size()) > max_attachment_size)
		return "attachment too large";
	for (int x : attachment)
		if (x != 0 && x != 1)
			return "invalid attachment integer value";
	vector<int> data(source);
	data.insert(data.end(), attachment.begin(), attachment.end());
	if (c >= int(data.size()))
		return "invalid corruption index";
	if (c >= 0)
		data[c] = 1-data[c];
	vector<int> result_source = retrieve(data);
	if (source != result_source)
		return "wrong source retrieval";
	return string("OK K=")+to_string(attachment.size());
}
int main() {
	int T;
	cin >> T;
	for (int scenario = 0; scenario < T; scenario++) {
		string result = run_scenario();
		cout << "scenario #" << scenario << ": " << result << endl;
	}
	return 0;
}
