[CF1399D] Binary String To Subsequences - 构造
Description
把一个 01 串划分成若干个 01 交替的子序列,求最小划分数量并给出任意一组合法划分
Solution
考虑一个贪心的划分过程
维护两个无序集合,一个表示当前划分出的,末尾是 0 的序列,一个表示末尾是 1 的序列,存编号
每次遇到一个 0,就从末尾是 1 的里面取出一个,标记,然后扔进末尾是 0 的那个集合里面
反之亦然
如果不够,就开一个新的
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n;
cin >> n;
string str;
cin >> str;
str = " " + str;
vector<int> v[2];
int ind = 0;
vector<int> ans(n + 2);
for (int i = 1; i <= n; i++)
{
int cur = str[i] == '1';
if (v[cur].size() == 0)
v[cur].push_back(++ind);
int p = v[cur].back();
v[cur].pop_back();
v[cur ^ 1].push_back(p);
ans[i] = p;
}
cout << ind << endl;
for (int i = 1; i <= n; i++)
cout << ans[i] << " ";
cout << endl;
}
signed main()
{
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--)
{
solve();
}
}