题意:将给定字符串分成最少个字串,标明原串中每个字符在第几个子串中(编号),字串不能有连续字符。
题解:遇到0时,因为不连续,后面跟1,此时如果1为空,只能新建一个子串;如果1非空,取一个1放在0后面。
#include<bits/stdc++.h>
using namespace std;
char s[200010];
int main()
{
int t, n, i;cin >> t;
while (t--){
cin >> n >> s;
queue<int>q0, q1;
vector<int>v;
int id = 1;
for (i = 0; i < n; i++){
if (s[i] == '0'){
if (q1.empty()) v.push_back(id++);
else v.push_back(v[q1.front()]), q1.pop();
q0.push(i);
}
else{
if (q0.empty()) v.push_back(id++);
else v.push_back(v[q0.front()]), q0.pop();
q1.push(i);
}
}
cout << id - 1 << endl;
for (i = 0; i < n; i++)
!i ? cout << v[i] : cout << ' ' << v[i];
cout << endl;
}
}