题解:CF1530G What a Reversal
构造好题。*3300 的难度应该是有的。
首先注意到操作可逆,于是我们可以对
于是在第一阶段我们从后往前贪心让
但是注意到
所以当剩下未匹配的
发现我们可以容易地将
通过手玩注意到当 0111..1 怎么做即可。
通过打表注意到当
于是尝试寻找不变量,这个不变量应当和奇偶性有关。考虑
于是当所有
模拟即可。操作次数很少。
#include "bits/stdc++.h"
#ifdef DEBUG
#include "PrettyDebug.hpp"
#else
#define debug(...) [](){}()
#define debuga(...) [](){}()
#endif
#define For(i,a,b) for(int i=a;i<=b;i++)
#define Rev(i,a,b) for(int i=a;i>=b;i--)
#define Fin(file) freopen(file,"r",stdin)
#define Fout(file) freopen(file,"w",stdout)
using namespace std; typedef long long ll;
constexpr int N=2e3+5; using pii = pair<int,int>;
int n,K,a[N],b[N]; vector<pii> ans1,ans2;
void DoA(int l,int r) { ans1.emplace_back(l,r); reverse(a+l,a+r+1); }
void DoB(int l,int r) { ans2.emplace_back(l,r); reverse(b+l,b+r+1); }
bool DONE(){
if(memcmp(a+1,b+1,n<<2)!=0) return false;
cout<<ans1.size()+ans2.size()<<'\n';
reverse(ans2.begin(),ans2.end());
for(auto [l,r]:ans1) cout<<l<<' '<<r<<'\n';
for(auto [l,r]:ans2) cout<<l<<' '<<r<<'\n';
return true;
}
void Mian(){
ans1.clear(); ans2.clear();
cin>>n>>K; char str[N]; cin>>str; For(i,1,n) a[i]=str[i-1]-'0';; cin>>str; For(i,1,n) b[i]=str[i-1]-'0';
if(DONE()) return;
if(K==0) return cout<<"-1\n",void();
int A1=count(a+1,a+1+n,1);
if(A1!=count(b+1,b+1+n,1)) return cout<<"-1\n",void();
if(K>A1) return cout<<"-1\n",void();
if(K==A1){
DoA(find(a+1,a+1+n,1)-a,n);
DoB(find(b+1,b+1+n,1)-b,n);
if(DONE()) return;
DoA(find(a+1,a+1+n,1)-a,n);
if(DONE()) return; else return cout<<"-1\n",void();
}
int p=n;
while(p>0&&A1>K+1){
if(a[p]==b[p]) { A1-=a[p--]; continue; }
if(a[p]==0){
int tt=0,o=0; Rev(i,p,1) if((tt+=a[i])==K) { o=i; break; }
assert(o); DoA(o,p);
}
else{
int tt=0,o=0; Rev(i,p,1) if((tt+=b[i])==K) { o=i; break; }
assert(o); DoB(o,p);
}
assert(a[p]==b[p]); p--; A1--;
}
if(p==0) return assert(DONE()),void();
debug(A1); debuga(a,1,p); debuga(b,1,p);
int l=1,r=p; while(a[l]==0) l++;; while(a[r]==0) r--;
For(_,1,K){
if(_&1) { DoA(l+1,r); while(a[r]==0) r--; }
else { DoA(l,r-1); while(a[l]==0) l++; }
}
debuga(a,1,p);
if(K&1) { For(_,1,K+1) if(_&1) DoA(1,r-1); else DoA(2,r); }
debuga(a,1,p);
l=1,r=p; while(b[l]==0) l++;; while(b[r]==0) r--;
For(_,1,K){
if(_&1) { DoB(l+1,r); while(b[r]==0) r--; }
else { DoB(l,r-1); while(b[l]==0) l++; }
}
debuga(b,1,p);
if(K&1) { For(_,1,K+1) if(_&1) DoB(1,r-1); else DoB(2,r); }
debuga(b,1,p);
if(DONE()) return; else return cout<<"-1\n",assert(~K&1),void();
}
signed main(){
atexit([](){cerr<<"Time = "<<clock()<<" ms"<<endl;});
int T; cin>>T; while(T--) Mian();
return 0;
}
// CONTINUE, NON-STOPPING, FOR CHARLIEY
// START TYPING IF YOU DON'T KNOW WHAT TO DO
// STOP TYPING IF YOU DON'T KNOW WHAT YOU'RE DOING
// Started Coding On: May 08 Wed, 15 : 39 : 16