Submission #307953

#TimeUsernameProblemLanguageResultExecution timeMemory
307953urd05Data Transfer (IOI19_transfer)C++14
0 / 100
7 ms2668 KiB
#include "transfer.h"
#include <bits/stdc++.h>
using namespace std;

vector<int> get_attachment(vector<int> source) {
	int n=source.size();
	int val=0;
	int x=0;
	for(int i=0;i<n;i++) {
	    if (source[i]==1) {
	        val+=i+1;
	        val%=2*(n+1);
	        x^=1;
	    }
	}
	vector<int> ret;
	if (n==63) {
	    for(int i=0;i<7;i++) {
	        ret.push_back((val%2)^x);
	        val/=2;
	    }
	}
	else {
	    for(int i=0;i<9;i++) {
	        ret.push_back((val%2)^x);
	        val/=2;
	    }
	}
	return ret;
}

vector<int> retrieve(vector<int> data) {
    vector<int> ret;
	if (data.size()==70) {
	    int x=0;
	    for(int i=0;i<70;i++) {
	        x^=data[i];
	    }
	    if (x==1) {
	        for(int i=0;i<63;i++) {
	            ret.push_back(data[i]);
	        }
	        return ret;
	    }
	    x=0;
	    for(int i=0;i<63;i++) {
	        x^=data[i];
	    }
	    if (x==0) {
	        for(int i=63;i<70;i++) {
	            data[i]^=1;
	        }
	    }
	    int xval=0;
	    for(int i=63;i<70;i++) {
	        xval+=(data[i]<<(i-63));
	    }
	    int pos=-1;
	    int val=0;
	    for(int i=0;i<63;i++) {
	        if (data[i]==1) {
	            val+=i+1;
	            val%=128;
	        }
	    }
	    for(int i=0;i<63;i++) {
	        if (data[i]==0) {
	            if ((val+i+1)%128==xval) {
	                pos=i;
	                break;
	            }
	        }
	        else {
	            if ((xval+i+1)%128==val) {
	                pos=i;
	                break;
	            }
	        }
	    }
	    for(int i=0;i<63;i++) {
	        ret.push_back(data[i]^(pos==i));
	    }
	}
	else {
	    int x=0;
	    for(int i=0;i<264;i++) {
	        x^=data[i];
	    }
	    if (x==1) {
	        for(int i=0;i<255;i++) {
	            ret.push_back(data[i]);
	        }
	        return ret;
	    }
	    x=0;
	    for(int i=0;i<255;i++) {
	        x^=data[i];
	    }
	    if (x==0) {
	        for(int i=255;i<264;i++) {
	            data[i]^=1;
	        }
	    }
	    int xval=0;
	    for(int i=255;i<264;i++) {
	        xval+=(data[i]<<(i-255));
	    }
	    int pos=-1;
	    int val=0;
	    for(int i=0;i<255;i++) {
	        if (data[i]==1) {
	            val+=i+1;
	            val%=512;
	        }
	    }
	    for(int i=0;i<255;i++) {
	        if (data[i]==0) {
	            if ((val+i+1)%512==xval) {
	                pos=i;
	                break;
	            }
	        }
	        else {
	            if ((xval+i+1)%512==val) {
	                pos=i;
	                break;
	            }
	        }
	    }
	    for(int i=0;i<255;i++) {
	        ret.push_back(data[i]^(pos==i));
	    }
	}
	return ret;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...