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 #include2 3 using namespace std; 4 const int maxn=2e5+10; 5 char s[maxn]; 6 vector 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