4993. FEB - AcWing题库
大佬亲笔
将原串分成三段:
FFF|E.....B|FFF
先合并中间段,再合并两边的段
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <queue>
#define endl '\n'
#define x first
#define y second
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
int n;
string s;
void solve()
{
cin >> n >> s;
if (s == string(n,'F')) // 是否全为F
{
cout << n << endl;
for (int i = 0;i < n;i ++)
cout << i << endl;
}
else
{
int l = 0,r = n - 1;
while(s[l] == 'F') l ++; //分第一段
while(s[r] == 'F') r--; //分第三段
int low = 0,high = 0;
string str = s;
for (int i = l;i <= r;i ++) // 中间段最小值
{
if (str[i] == 'F')
{
if (str[i - 1] == 'E') str[i] = 'B';
else str[i] = 'E';
}
if (i > l && str[i - 1] == str[i]) low ++;
}
str = s;
for (int i = l;i <= r;i ++) 中间段最大值
{
if (str[i] == 'F')
str[i] = str[i - 1];
if (i > l && str[i - 1] == str[i]) high ++;
}
int d = 2;
int len = l + n - r - 1;
if (len) high += len,d = 1;
cout << (high - low) / d + 1 << endl;
for (int i = low;i <= high;i += d)
cout << i << endl;
}
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int _ = 1;
while(_--) solve();
return 0;
}