题意:
给你一个01串 要求把他分成不同的子序列 并且子序列中不能有两个相同的数相邻 输出分成最少子序列的个数 并且 输出每个0或者1分别在哪个子序列
思路:
一开始看到这个题,就想到用栈或者队列来模拟这个过程,vector来存答案,但是栈无法得到最初未配对0或者1出现的位置,所以采用队列,我们开两个队列,一个用来存0的位置,一个用来存1的位置。
1.当遇到0时,首先肯定先找有没1和他配对,如果队列1为空的话,说明这个0得属于新的一个序列,就往vector里存答案,如果有的话,往答案里存入队列1里队头序列的位置形成配对,并且弹出代表已经配对成功了,最后记得把当前0的位置存一下
2.1的话同理 和0的操作对应
code:
#include <bits/stdc++.h>
using namespace std;
stack<char> st;
int main() {
ios::sync_with_stdio(0);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
string s;
cin >> s;
vector<int> v;
queue<int> q0, q1;
int cnt = 1;
for (int i = 0; i < n; i++) {
if (s[i] == '0') {
if (q1.empty()) {
v.push_back(cnt++);
} else {
v.push_back(v[q1.front()]);
q1.pop();
}
q0.push(i);
} else {
if (q0.empty()) {
v.push_back(cnt++);
} else {
v.push_back(v[q0.front()]);
q0.pop();
}
q1.push(i);
}
}
cout << -- cnt << '\n';
for(int i = 0;i < v.size();i ++){
cout << v[i] << ' ';
}
cout << '\n';
}
return 0;
}