CF949A && LFYZOJ#111 Zebras

由于每个子串以0开头,以0结束.

容易得到:0的个数必须比1多.

我们设置一个统计数量的变量cnt.

由于不知道子串个数,防止炸空间,用二维的动态数组vector.

先输入 然后扫一遍,遇到0 cnt++,并且把0的位置压进数组.遇到1 cnt--,并把1的位置压进数组.因为遇到0后再遇到1 cnt的值不会变,所以此时的子串0和1的位置就放到了数组的cnt这同一行上.如果cnt比0小直接输出-1.

上代码

#include<bits/stdc++.h>
using namespace std;
char s[200005];
int l,cnt,k;
vector<int>q[200005];
int main(){
    scanf("%s",s);
    l=strlen(s);
    for(int i=0;i<l;i++){
        if(s[i]=='0')q[cnt++].push_back(i+1);
        else{
            if(cnt==0){
                printf("-1");
                return 0;
            }
            q[--cnt].push_back(i+1);
        }
        k=max(k,cnt);
    }
    if(cnt!=k){
        printf("-1");
        return 0;
    }
    printf("%d\n",cnt);
    for(int i=0;i<cnt;i++){
        printf("%d",q[i].size());
        for(int j=0;j<q[i].size();j++)
            printf(" %d",q[i][j]);
        printf("\n");
    }
    return 0;
}
posted @ 2018-04-25 12:02  PushinL  阅读(213)  评论(0编辑  收藏  举报