题解 魔法
先来个结论:如果有 \(R+B\) 个数是符合条件的,则直接将其删掉没有后效性
于是用一个栈维护这个东西,如果栈顶的 \(R+B\) 个符合要求了就删掉
如果最后栈里还有剩的元素则无解
Code:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 100010
#define ll long long
#define pb push_back
//#define int long long
int n, m, r, b;
char s[N];
namespace force{
int sta[N], rsta[N], bsta[N], top, cnt;
vector<int> v[N];
void solve() {
for (int i=1; i<=n; ++i) {
sta[++top]=i;
if (s[i]=='R') rsta[top]=1, bsta[top]=0;
else rsta[top]=0, bsta[top]=1;
rsta[top]+=rsta[top-1]; bsta[top]+=bsta[top-1];
if (top>=m && rsta[top]-rsta[top-m]==r && bsta[top]-bsta[top-m]==b) {
++cnt;
for (int j=1; j<=m; ++j) v[cnt].pb(sta[top--]);
}
}
if (top) {puts("NO"); exit(0);}
assert(0);
puts("YES");
printf("%d\n", cnt);
for (int i=cnt; i; --i) {
for (auto j:v[i]) printf("%d ", j);
printf("\n");
}
exit(0);
}
}
signed main()
{
freopen("magic.in", "r", stdin);
freopen("magic.out", "w", stdout);
scanf("%d%d%d", &n, &r, &b); m=r+b;
scanf("%s", s+1);
force::solve();
return 0;
}