题目链接:1393 0和1相等串
思路:把0当成-1,然后求前缀和。如果出现前缀和相等的,那么这个串肯定就满足要求。因为只要求最长的,所以只需要存前缀和首次出现的位置即可,之后再遇到就可以直接更新答案。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 2e6 + 10; 5 int sum[maxn]; 6 char s[maxn>>1]; 7 int main() { 8 gets(s); 9 int l = strlen(s); 10 memset(sum, -1, sizeof(sum)); 11 sum[l] = 0; 12 int ans = 0; 13 int tsum = l; 14 for(int i=0; i<l; i++) { 15 if(s[i] == '1') tsum ++; 16 else tsum --; 17 if(sum[tsum] >= 0) { 18 ans = max(ans, i - sum[tsum] + 1); 19 } else { 20 sum[tsum] = i + 1; 21 } 22 } 23 printf("%d ", ans); 24 return 0; 25 }