Codeforces Round #469 (Div. 2)C. Zebras

http://codeforces.com/contest/950/problem/C

题意:给定一个01字符串s,求它的子串,子串满足两个条件 :

①子串必须的01010....相互交换的(只含有0,其长度为1也是符合的)。

②子串的开头和结尾必须是0.

(字符串最大长度为200 000.)

如果不存在这样的子串则输出-1;否则输出一个k(k为子串的个数,k值不必的最值),接下来的k行,输出子串的长度和其在s上的序列数

 

这道题在比赛的时候卡了时间在第八组的时候TLE了,(当时脑壳瓦特了,一直想的是用数组来存答案。。。就是没有去想用vector来做),可能比较一更筋吧!其实这道题就是一个思维的想法,因为输出的答案可以不唯一,就看你是怎么获取01的(就是一个模拟吧!@~!~)

 

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 const int maxn=2e5+10;
 5 char s[maxn];
 6 vector<int>v[maxn];
 7 
 8 int main()
 9 {
10     scanf("%s",s+1);
11     int len=strlen(s+1);
12     if(s[1]=='1')
13     {
14         printf("-1\n");
15         return 0;
16     }
17     int cnt=0;
18     int mx=0;
19     for(int i=1;i<=len;i++)
20     {
21         if(s[i]=='0')
22             v[cnt++].push_back(i);
23         if(s[i]=='1')
24             v[--cnt].push_back(i);
25         if(cnt==0&&s[i+1]=='1')
26         {
27             printf("-1\n");
28             return 0;
29         }
30         mx=max(mx,cnt);///mx就是记录vector数组的大小,也可以说是子串的个数
31     }
32     int ss=v[0].size();
33     for(int i=0;i<mx;i++)
34     {
35         ss=v[i].size();
36         if(s[v[i][ss-1]]=='1')///判断末尾字符是否为1
37         {
38             printf("-1\n");
39             return 0;
40         }
41     }
42     printf("%d\n",mx);
43     for(int i=0;i<mx;i++)
44     {
45         int ss=v[i].size();
46         printf("%d",ss);
47         for(int j=0;j<ss;j++)
48             printf(" %d",v[i][j]);
49         printf("\n");
50     }
51     return 0;
52 }

 

posted @ 2018-03-10 11:54  孟加拉国  阅读(208)  评论(0编辑  收藏  举报