题解:P11481 [NordicOI 2017] IP over Avian Carriers(通信题无法评测)
andychen_2012 · · 题解
提交通道:IP over Avian Carrier - Problem - QOJ.ac
我一开始的想法是,将连续
我们首先将串
当
当
当
核心代码如下,其中
bitset<M> f(int N,bitset<M> x,bitset<M> y){
bitset<M> z;
z.reset();
for(int i=0;i<N;++i) z[i]=x[i]^y[i]^((i&1)?y[(i+1)%N]:x[(i+1)%N]);
return z;
}
string g(int N,bitset<M> A[6],bool vis[5]){
string code(2*N,'0');
if(vis[0]){
if(vis[2])
A[1]=A[0]^A[2];
if(vis[3]){
for(int i=0;i<N;i+=2) A[1][i]=(A[3][i]^A[0][i]^A[0][(i+1)%N]);
for(int i=1;i<N;i+=2) A[1][i]=(A[3][i]^A[0][i]^A[1][(i+1)%N]);
}
}
else if(vis[1]){
if(vis[2])
A[0]=A[1]^A[2];
if(vis[3]){
for(int i=1;i<N;i+=2) A[0][i]=(A[3][i]^A[1][i]^A[1][(i+1)%N]);
for(int i=0;i<N;i+=2) A[0][i]=(A[3][i]^A[1][i]^A[0][(i+1)%N]);
}
}
else if(vis[2]){
for(int i=0;i<N;++i) A[(i&1)][(i+1)%N]=A[2][i]^A[3][i];
for(int i=0;i<N;++i) A[((i&1)^1)][(i+1)%N]=A[2][(i+1)%N]^A[(i&1)][(i+1)%N];
}
for(int i=0;i<N;++i) code[i]=(char)A[0][i]+'0';
for(int i=0;i<N;++i) code[i+N]=(char)A[1][i]+'0';
return code;
}
string decode(int C, int K, int N, vector<string> Y, vector<int> I) {
bitset<M> A[6];
string code(C*N, '0');
for(int i=0;i<C;++i){
for(int j=i+1;j<C;++j){
if(I[i]>I[j]){
swap(I[i],I[j]);
swap(Y[i],Y[j]);
}
}
}
bool vis[5]={0};
for(int i=0;i<C;++i) vis[I[i]]=1;
#define setA for(int i=0;i<K;++i) A[i].reset();\
for(int j=0;j<C;++j) for(int i=0;i<N;++i) A[I[j]][i]=Y[j][i]-'0';
setA
if(C==3&&K==4){
if(I[2]==3){
bitset<M> s;
s=A[0]^A[1]^A[2]^A[3];
for(int i=0;i<3;++i){
if(vis[i]) continue;
A[i]=s;
break;
}
}
for(int i=0;i<3;++i){
for(int j=0;j<N;++j)
code[i*N+j]=(char)A[i][j]+'0';
}
}
else if(C==2&&K==4)
return g(N,A,vis);
else{
if(vis[4]){
bitset<M> s=A[4];
for(int i=0;i<3;++i){
if(vis[i]) A[i]^=s;
}
code.clear();
code=g(N,A,vis);
code+=Y[2];
}
else if(vis[3]){
if(vis[0]&&vis[1]) A[2]=A[0]^A[1];
else if(vis[0]&&vis[2]) A[1]=A[0]^A[2];
else if(vis[1]&&vis[2]) A[0]=A[1]^A[2];
for(int i=0;i<3;++i) vis[i]=!vis[i];
code.clear();
code=g(N,A,vis);
setA;
if(!vis[0]){
string y;
for(int i=0;i<N;++i) y.push_back((A[0][i]^(code[i]-'0'))+'0');
code+=y;
}
else if(!vis[1]){
string y;
for(int i=0;i<N;++i) y.push_back((A[1][i]^(code[i+N]-'0'))+'0');
code+=y;
}
}
else{
code.clear();
code+=change(N,A[1]^A[2]);
code+=change(N,A[0]^A[2]);
code+=change(N,A[0]^A[1]^A[2]);
}
}
return code;
}