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 secondusing 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;
}