AcWing 3777. 砖块
原题链接
简单
作者:
ycy
,
2021-07-23 20:39:21
,
所有人可见
,
阅读 335
交换是两两交换,所以要换掉的字符个数至少有一个是偶数
关于交换如果s[i],s[j]字符相同,中间的字符不同则需要进行交换的位置是i, i + 1, i + 2, … , j -2, j - 1
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
cin >> T;
while(T -- ){
int n;
string s;
cin >> n >> s;
if(n == 1){
cout << 0 << endl;
continue;
}
int w = 0, b = 0;
for(int i = 0; i < n; i ++ ){ //统计两种字符个数
if(s[i] == 'W') w ++ ;
else b ++ ;
}
if(w % 2 == 1 && b % 2 == 1){ //W,B字符个数都为奇数时不可能成功
cout << -1 << endl;
continue;
}
else if(w == n || b == n){ //如单个字符个数跟长度相等时不需要转换
cout << 0 << endl;
continue;
}
int f = w % 2 == 0 ? 1 : 0; //判断W的个数是否是偶数
vector<int > ans;
if(f){ //将字符都转换成W
for(int i = 0; i < n; i ++ ){
if(s[i] == 'W'){
int j = i + 1;
if(s[j] == 'W'){ //如果后一个字符也是W,直接往后移
i = j;
ans.push_back(i);
}
else {
while(s[j] != 'W') j ++ ; //找到最近的一个W
for(int k = i + 1; k <= j; k ++ )
ans.push_back(k);
i = j;
}
}
}
}
else {
for(int i = 0; i < n; i ++ ){
if(s[i] == 'B'){
int j = i + 1;
if(s[j] == 'B'){
i = j;
ans.push_back(i);
}
else {
while(s[j] != 'B') j ++ ;
for(int k = i + 1; k <= j; k ++ )
ans.push_back(k);
i = j;
}
}
}
}
cout << ans.size() << endl;
for(auto item : ans) cout << item << ' ';
cout << endl;
}
return 0;
}