乱搞题
- 以第一块颜色为准,从第二块开始遍历所有砖块,如果该块的颜色与第一块的颜色不同,那么就反转这块与下一块,直到倒数第二块。
- 判断最后一块是否与第一块颜色相同,若相同说明已经成功;
- 若不同则判断砖块总数的奇偶性:
- 若为奇数,则除最后一块外,一共有偶数块,那么就反转前面$1到n-1$块的颜色,最终将会与最后一块颜色相同;
- 若为偶数,则无解。
操作次数最多的是第4步,为$(n-1)+(n-1)/2$,小于$3n$满足题目条件。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int T;
cin >> T;
while (T--)
{
int n;
string s;
cin >> n;
cin >> s;
for (auto &c : s)
if (c == 'W') c = '0';
else c = '1';
vector<int> res;
for (int i = 1; i < n - 1; i++)
if (s[i] != s[0])
res.push_back(i), s[i] ^= 1, s[i + 1] ^= 1;
if (s[n - 1] != s[0])//如果最后一块的颜色与第一块不一样
{
if (n % 2 == 0) puts("-1");//且砖块总数为偶数
else
{
cout << res.size() + (n - 1) / 2 << endl;
for (auto &x : res) cout << x + 1 << ' ';
for (int i = 0; i < n - 1; i += 2)//再次反转前面偶数块的颜色
cout << i + 1 << ' ';
cout << endl;
}
}
else
{
if (res.empty()) puts("0");
else
{
cout << res.size() << endl;
for (auto &x : res) cout << x + 1 << ' ';
cout << endl;
}
}
}
}