原题链接
来源:CF1271B
最初看到答案不唯一,就知道可以暴力去做,最初就打算锁定第一个颜色,根据地一个颜色来确定整行砖块的最终颜色,然后不断地向后比较,遇到不同的就和后面的一起反转,直到最后检查是否相同。
在推样例检查BUG的时候,发现这样不严谨,因为有可能如果不能够让其全部变成黑色,也有可能全部变成白色,后来发现了当最初的颜色个数为偶数时,可以设定为整行的最终颜色,如果最初的颜色个数为奇数,则不可能实现整行全部为该颜色。
所以选择两种颜色都尝试一边,如果都不行就输出-1
代码看了闫总的,觉得很好看,仿照的闫总。闫总就是暴力尝试的,没有讨论颜色个数的奇数偶数问题,假设该行为黑色,然后开始暴力修改。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>pii;
const int maxn=2e5+5;
const int inf=0x3f3f3f3f;
int n;
void update(char& c)//转换字母
{
if (c == 'W')
c = 'B';
else
c = 'W';
}
bool check(string s,char c)
{
vector<int>res;//存放答案
for (int i= 0;i<n-1;i++ )
{
if(s[i]!=c)
{ res.push_back(i+1);
update(s[i]);
update(s[i + 1]);
}
}
if (s[n-1]!= s[0])//如果转化完成之后,首尾不相同
return false;
cout << res.size() << endl;
for (auto x: res)
cout <<x<< ' ';
if (res.size()>0)
cout<<endl;
return true;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
string s;
cin>>s;
if (!check(s, 'W') && !check(s, 'B'))
puts("-1");
}
return 0;
}