个人心得:思维比较混乱,已经慢慢找到了一特点就是这子字符串满足1,0数目相等,所将0用-1代替,则此时
sum【l-1】=sum【r】,然后想到这里还是要用俩重循环,还会超时,后面看了题解,他是用min,max数组记录相等
sum的位置,只要存在相等的sum然后循环一次取最大的差值就好了,真的是感觉自己做题做得太少了,暑假还是
不怎么上心,希望以后能改改吧。
给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
Input
一个字符串,只包含01,长度不超过1000000。
Output
一行一个整数,最长的0与1的个数相等的子串的长度。
Sample Input
1011
Sample Output
2
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int p=1000000; 7 char s[1000005]; 8 int sum[1000005]; 9 int mina[5000005],maxa[5000005]; 10 int main(){ 11 scanf("%s",s+1); 12 int le=strlen(s+1); 13 memset(mina,-1,sizeof(mina)); 14 memset(maxa,-1,sizeof(maxa)); 15 if(s[1]=='1') sum[1]=1; 16 else sum[1]=-1; 17 for(int i=2;i<=le;i++) 18 if(s[i]=='1') sum[i]=sum[i-1]+1; 19 else sum[i]=sum[i-1]-1; 20 for(int i=0;i<=le;i++) 21 { 22 int x=sum[i]; 23 if(mina[x+p]==-1) mina[x+p]=i; 24 } 25 for(int i=le;i>=0;i--) 26 { 27 int x=sum[i]; 28 if(maxa[x+p]==-1) maxa[x+p]=i; 29 } 30 int ans=0; 31 for(int i=0;i<=le+p;i++) 32 if(mina[i]!=-1) 33 ans=max(ans,maxa[i]-mina[i]); 34 cout<<ans<<endl; 35 return 0; 36 }