当前位置:网站首页>D. Binary String To Subsequences
D. Binary String To Subsequences
2022-08-09 21:55:00 【秦小咩】
D. Binary String To Subsequences
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given a binary string ss consisting of nn zeros and ones.
Your task is to divide the given string into the minimum number of subsequences in such a way that each character of the string belongs to exactly one subsequence and each subsequence looks like "010101 ..." or "101010 ..." (i.e. the subsequence should not contain two adjacent zeros or ones).
Recall that a subsequence is a sequence that can be derived from the given sequence by deleting zero or more elements without changing the order of the remaining elements. For example, subsequences of "1011101" are "0", "1", "11111", "0111", "101", "1001", but not "000", "101010" and "11100".
You have to answer tt independent test cases.
Input
The first line of the input contains one integer tt (1≤t≤2⋅1041≤t≤2⋅104) — the number of test cases. Then tt test cases follow.
The first line of the test case contains one integer nn (1≤n≤2⋅1051≤n≤2⋅105) — the length of ss. The second line of the test case contains nn characters '0' and '1' — the string ss.
It is guaranteed that the sum of nn does not exceed 2⋅1052⋅105 (∑n≤2⋅105∑n≤2⋅105).
Output
For each test case, print the answer: in the first line print one integer kk (1≤k≤n1≤k≤n) — the minimum number of subsequences you can divide the string ss to. In the second line print nn integers a1,a2,…,ana1,a2,…,an (1≤ai≤k1≤ai≤k), where aiai is the number of subsequence the ii-th character of ss belongs to.
If there are several answers, you can print any.
Example
input
Copy
4 4 0011 6 111111 5 10101 8 01010000
output
Copy
2 1 2 2 1 6 1 2 3 4 5 6 1 1 1 1 1 1 4 1 1 1 1 1 2 3 4
=========================================================================
贪心的策略当然是能加就加进原本就有的,不能加的时候再重新开辟一个
这里用vector进行模拟,末尾存当前串的编号即可
# include<iostream>
# include<string.h>
# include<vector>
using namespace std;
int ans[200000+10];
int main ()
{
//从前往后扫
//1的话就加进去0,把加进去的0结尾变成1结尾
//0的话就加1,把加进去的1结尾变成0结尾
//也就是贪心+模拟,能加就加即可,并不影响后来的
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
vector<int>v[2];
string s;
cin>>s;
s=" "+s;
int now=s[1]-'0';
int cnt=1;
ans[1]=cnt;
v[now].push_back(ans[1]);
for(int i=2; i<=n; i++)
{
if(s[i]=='0')
{
if(v[1].empty())
{
cnt++;
ans[i]=cnt;
v[0].push_back(ans[i]);
}
else
{
int now=v[1].back();
v[1].pop_back();
ans[i]=now;
v[0].push_back(ans[i]);
}
}
else
{
if(v[0].empty())
{
cnt++;
ans[i]=cnt;
v[1].push_back(ans[i]);
}
else
{
int now=v[0].back();
v[0].pop_back();
ans[i]=now;
v[1].push_back(ans[i]);
}
}
}
cout<<cnt<<endl;
for(int i=1; i<=n; i++)
{
cout<<ans[i]<<" ";
}
cout<<endl;
}
return 0;
}
边栏推荐
- abstract class or interface
- 18-GuliMall 压力测试与性能监控
- laravel table migration error [easy to understand]
- 在“企业通讯录”的盲区,融云的边界与分寸
- String hashing (2014 SERC J question)
- leetcode 刷题日记 计算右侧小于当前元素的个数
- 大型分布式存储方案MinIO介绍,看完你就懂了!
- The kvm virtual machine cannot be started, NOT available, and the PV is larger than the partition
- 【软考 系统架构设计师】案例分析⑤ 质量属性和架构评估
- 2.1.5 大纲显示问题
猜你喜欢
随机推荐
SecureCRT sets the timeout period for automatic disconnection
The round functions in the np, ceil function and floor function
Rust dereference
[Cloud Native] 4.2 DevOps Lectures
金山云地震,震源在字节?
unit test
AI Knows Everything: Building and Deploying a Sign Language Recognition System from Zero
MySQL——JDBC
注意力引导网络用于视网膜图像分割
Basic JSON usage
力扣 1413. 逐步求和得到正数的最小值
Pagoda measurement - building LightPicture open source map bed system
CVPR22 Oral | shunt through multi-scale token polymerization from attention, code is open source
重要的不是成为海贼王,而是像路飞一样去冒险
Xiaohei's leetcode journey: 94. Inorder traversal of binary trees (supplementary Morris inorder traversal)
在“企业通讯录”的盲区,融云的边界与分寸
腾讯继续挥舞降本增效“大刀”,外包员工免费餐饮福利被砍了
JS–比想象中简单
Chatting embarrassing scenes, have you encountered it?Teach you to get the Doutu emoticon package with one click, and become a chat expert
发送激活邮件「建议收藏」