题目链接: Balanced Substring
题意:
求一个只有1和0的字符串中1与0个数相同的子串的最大长度。
题解:
我的解法是设1的权值是1,设0的权值是-1,求整个字符串的前缀和并记录每个前缀和出现的最后位置。因为两个相同的前缀和之间的子串一定符合条件,最后只用遍历一次,将每个前缀与和这个前缀值相同的位置之间的长度求出来就是符合条件的子串长度。但是这里一定要注意!在整个子串未开始遍历的时候这个子串的前缀和也是0。我就是在这个地方错了,这里给出错地方的数据。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAX_N = 1e5+9; 4 const int INF = 1e5; 5 char vec[MAX_N]; 6 int res[MAX_N],val[MAX_N*2]; 7 int N,M,t,num; 8 void init() 9 { 10 res[0] = 0; 11 memset(val,0,sizeof(val)); 12 } 13 int main() 14 { 15 cin>>N; 16 scanf("%s",vec+1); 17 for(int i=0;i<=N;i++) 18 { 19 if(vec[i] == ‘0‘) res[i+1] = res[i] - 1; 20 else res[i+1] = res[i] + 1; 21 val[res[i+1] + INF] = i; 22 } 23 int ans = -1; 24 for(int i=1;i<=N+1;i++) 25 { 26 ans = max(ans,val[res[i]+INF] - i + 1); 27 } 28 cout<<ans<<endl; 29 return 0; 30 } 31 32 /* 33 18 34 011010101110111101 35 36 ans : 8 37 */