Description

题目地址: Codeforces

题意:给你一串只含01的字符串,判断能否将字符串分为k个子序列,使得子序列满足以下条件:

  1. 开头和结尾都是0
  2. 相邻的2个数是01或者10

如0, 010, 01010 是合法的,1, 0110, 0101不合法

要求输出方案

(k可以为任意正整数,评测用SPJ)

Solution

我们发现,0可以单独为一组,那么只要匹配完所有的1剩下的0全单独算就行了

对于方案可以用vector储存,关键在于如何划分子序列

开一个指针变量p和一个方案数cnt,p指向一个序列,且保证当前p序列的最后面是0

现在依次考虑每个数字

如果当前数字是0并且p==cnt那么直接新开一个序列,否则把这个0放到p+1的序列中,且++p,这里因为p<cnt所以p+1的序列中必定结尾为1

如果数字是1就把这个1直接放在当前p的序列中,然后p--,这里保证当前序列结尾是0,且p-1的序列结尾是0

简单来说,保证结尾为1的序列全在p的后面,前面(包括p)的序列结尾都是0

方法挺巧妙的,时间复杂度为O(n)

Code

#include <cstdio>
#include <vector>
#include <ctype.h>
using namespace std; vector<int> Ans[200010];
int p,cnt,n=1; int main(){
for(char ch=getchar();isdigit(ch);ch=getchar(),n++)
if(ch=='1'){
if(!p){printf("-1\n");return 0;}//1过多的情况
Ans[p--].push_back(n);
}else if(p==cnt) Ans[p=++cnt].push_back(n);
else Ans[++p].push_back(n);
if(p<cnt){printf("-1\n");return 0;}//0过多的情况
printf("%d\n",cnt);
for(int i=1;i<=cnt;++i){
printf("%d ",Ans[i].size());
for(int j=0;j<Ans[i].size();++j)
printf("%d ",Ans[i][j]);
printf("\n");
}
return 0;
}

[CodeForces950C]Zebras的更多相关文章

  1. Codeforces Round #469 (Div. 2)C. Zebras(思维+模拟)

    C. Zebras time limit per test memory limit per test 512 megabytes input standard input output standa ...

  2. A - Zebras

    Oleg writes down the history of the days he lived. For each day he decides if it was good or bad. Ol ...

  3. Codeforces 950 C. Zebras

    http://codeforces.com/contest/950/problem/C 题意: 给出一个01序列,问能否将这个序列分为若干个0开头0结尾的序列 输出方案 如果有解,几个1能在一个序列就 ...

  4. CodeForces - 950C Zebras 模拟变脑洞的天秀代码

    题意:给你一个01串,问其是否能拆成若干形如0101010的子串,若能,输出所有子串的0,1 的位置. 题解:一开是暴力,然后瞎找规律, 最后找到一种神奇的线性构造法:扫一遍字符串,若为0就一直竖着往 ...

  5. Zebras CodeForces - 950C(思维)

    借鉴自: https://www.cnblogs.com/SuuT/p/8619227.html https://blog.csdn.net/my_sunshine26/article/details ...

  6. codeforce469DIV2——C. Zebras

    题意 0, 010, 01010 这一类的01交替且开头和结尾都为0的序列被称为zebra序列.给出一段01序列,尝试能否把他分为k个子序列使得每个子序列都是zebra序列. 分析 这个题应该算是水题 ...

  7. CF949A/950C Zebras

    思路: 贪心乱搞. 实现: #include <bits/stdc++.h> using namespace std; vector<vector<int>> v; ...

  8. CF949A Zebras 构造

    是一道不错的构造题. 我们观察,一个 111 的前后必须都有 000. 那么,我们开一个二维数组 (vector)(vector)(vector),这样每遇到一个 000 就将 000 加入到当前的 ...

  9. Codeforces 950C Zebras ( 贪心 && 模拟 )

    题意 : 给出一个 01 串,要求你将其分隔出若干个子序列 ( 每个数字只能属于某一个子序列 ) ,子序列必须满足由 0 开头和结尾,且中间需 01 交替构成.若无法做到,则输出 -1. 分析 :  ...

随机推荐

  1. 3.HTML DOM

    介绍 DOM(Document Object Model)文档对象模型,定义了访问 HTML 和 XML 文档的标准,它允许程序和脚本动态地访问和更新文档的内容.结构和样式. 那显然,HTML DOM ...

  2. spring笔记2-注解

    一.属性与成员变量的区别: 属性:对外暴露的,getxxx/setxxx称为属性; 成员变量:private String name称为成员变量或字段 二.applicationContext.xml ...

  3. [javascript]什么是闭包?

    http://www.zcfy.cc/article/master-the-javascript-interview-what-is-a-closure-2127.html

  4. ssh-agent && ssh-agent forward && SSH ProxyCommand

    http://blog.csdn.net/sdcxyz/article/details/41487897 https://developer.github.com/guides/using-ssh-a ...

  5. SQL varchar转float实现数字比较

    select * from table where cast('经纬度' as float ) < 90

  6. java——二叉树面试题

    import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util ...

  7. log4net 简单配置

    <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigu ...

  8. TypeScript学习-TypeScript环境配置

    http://blog.csdn.net/shi_weihappy/article/details/49332091

  9. kubernetes-控制器statefulset和Job(十三)

       从前面的学习我们知道使用Deployment创建的pod是无状态的,当挂载了Volume之后,如果该pod挂了,Replication Controller会再启动一个pod来保证可用性,但是由 ...

  10. C# while语句

    一.C# while语句 while语句是用于重复执行程序代码的语句. 语法格式如下: while(boolean-expression){    embedded-statement} 当boole ...