51nod 1393 0和1相等串 思路 : map存前缀和

来源:互联网 发布:软件运维工程师 编辑:程序博客网 时间:2024/06/05 11:40
题目:

 

思路:把'0'当成数字-1,'1'当成数字1,求前缀和,用map更新当前前缀和最早出现的位置。(用map而不用数组是因为可能会出现负数)

   当前缀和的值之前出现过,比如i = 10时,sum = 0;j = 50时,sum = 0; 更新ans = max(ans,j-i);

 

 

下面是一个例子:

 

代码:

#include <bits\stdc++.h>using namespace std;map<int,int> m; //存前缀和最早出现的位置 int a[1000001]; //数字数组 int main(){    string s;    cin >> s;        //将字符串转换成数字数组     for (int i = 0; s[i]; ++i) {        if (s[i] == '0') a[i + 1] = -1;        else a[i + 1] = 1;    }    int ans = 0;  //最大长度     int sum = 0;  //前缀和     for (int i = 1; i <= s.length(); ++i) {        sum += a[i];   //m[i]默认是为0的 (i为任意值)                if (sum != 0 && m[sum] == 0) {              m[sum] = i; //之前未出现过相同值         }        else {            ans = max(ans, i - m[sum]); // 之前出现过相同值         }    }    cout << ans << endl;    return 0;}