MLE+样例没过 记录
#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<map>
using namespace std;
const int L=2e7;
string s,endd;
int n;
struct node{
string now;
int pos,bs,last,change;
}dl[L];
int len;
map<string,bool> pc;
int cnt;
void print(int i){
if(dl[i].last)print(dl[i].last);
if(dl[i].change){
printf("%d ",dl[i].change+1);
cnt++;
if(cnt==20)printf("\n");
}
}
void add(int a,int b,string news,int bs,int ls){
swap(news[a],news[b]);
if(pc[news])return;
else {
pc[news]=1;
len++;
dl[len].bs =bs+1;
dl[len].now =news;
dl[len].pos=b;
dl[len].last =ls;
dl[len].change =b;
//if
if(dl[len].now==endd){
// cout<<dl[len].bs<<"\n";
print(len);exit(0);
}
}
}
int main(){
cin>>n;
len++;
string a(n,'W'),b(n,'B');
endd=b+" "+a;
dl[len].now=a+" "+b;
dl[len].pos=n;
dl[len].last =0;
dl[len].bs =0;
pc[dl[len].now]=1;
int siz=2*n;
//node u=dl[1];
//cout<<u.now[u.pos-2]<<" "<<u.now[u.pos-1];
for(int i=1;i<=len;i++){
node u=dl[i];
if(u.pos>=2&&u.now[u.pos-2]!=u.now[u.pos-1])add(u.pos,u.pos-2,u.now,u.bs,i);
if(u.pos>=1)add(u.pos,u.pos-1,u.now,u.bs,i);
if(u.pos<siz)add(u.pos,u.pos+1,u.now,u.bs,i);
if(u.pos<siz-1&&u.now[u.pos+2]!=u.now[u.pos+1])add(u.pos,u.pos+2,u.now,u.bs,i);
}
}