1. 程式人生 > >Codeforces 873 B. Balanced Substring(前綴和 思維)

Codeforces 873 B. Balanced Substring(前綴和 思維)

pre 長度 位置 har substring sin namespace pos ret

題目鏈接: 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 */

Codeforces 873 B. Balanced Substring(前綴和 思維)