51nod

题目链接: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 }
原文地址:https://www.cnblogs.com/fredy/p/5868237.html