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 }