直接贴码了,注释可能有误,欢迎指出
#include<bits/stdc++.h>
using namespace std;
/*
注意到操作过程其实是可逆的
swap有一种方法就是x=x^y y = x^y x = x^y,灵感来源?
所以说其实a,b数组是由基向量生成出来的,如果a数组可以变成b数组,那么他们的基向量得是等价的,既然是等价的必然可以相互转化
所以有了构造思路就是把数组变成同一组0000+基向量的形式
那么答案就是a变成基的正向过程+b变成基的逆向过程
details:
(1)对两个不同位置的数操作其实就是把一个数swap到另一个数旁边异或一下,再swap回去
*/
int n;
inline void solve(){
cin>>n;
vector<int>c(n+1),b(n+1);
for(int i = 1;i<=n;++i) cin>>b[i];
for(int i = 1;i<=n;++i) cin>>c[i];
auto get=[&](vector<int> &a)->vector<pair<int,int>>{
vector<int> base(20),pos(20,-1),ff(n+1,-1);//基,基的位置,位置的基(逆映射)
vector<pair<int,int>> op;
auto swp=[&](int x,int y)->void{
op.push_back({
x,y});
op.push_back({
y,x});
op.push_back({
x,y});
};
auto insert=[&](int x,int po)->
ACM算法C++代码分享

最低0.47元/天 解锁文章
3616

被折叠的 条评论
为什么被折叠?



