题意:
给定长度为n的字符串,让你把字符串分成多个子序列,使得每个子序列都不会出现连续相同的数?
问最少划分多少个子序列,输出每个字符在第几个子序列中
解析:
用两个队列分别记录0和1出现在哪几个组中
当遇到1的时候,我们判断q0是否为空,如果为空,则需要新分组。如果不空当前1可以和队头组成一组,然后把队头出队。再把1的分组序号记录到q1队列中
遇到0 同上即可。
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int f[N];
int t,n;
char s[N];
vector<int> v;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
scanf("%s",s+1);
v.clear();
queue<int> q0,q1;
for(int i=0;i<=n;i++) f[i]=-1;
int cnt=0;
for(int i=1;i<=n;i++){
if(cnt==0){
++cnt;
if((s[i]-'0')==1) q1.push(cnt);
else q0.push(cnt);
v.push_back(cnt);
}
else
{
int ch=(s[i]-'0') ? 0:1;
if(ch==0){
if(q0.size()==0){
++cnt;
q1.push(cnt);
v.push_back(cnt);
}
else{
v.push_back(q0.front());
q1.push(q0.front());
q0.pop();
}
}
else{
if(q1.size()==0){
++cnt;
q0.push(cnt);
v.push_back(cnt);
}
else{
v.push_back(q1.front());
q0.push(q1.front());q1.pop();
}
}
}
}
printf("%d\n",cnt);
for(auto x:v){
printf("%d ",x);
}
printf("\n");
}
}
/* 4
0010
2
1 2 2 2*/