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;
}
不如吃茶去