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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1393 0和1相等串 思路 : map存前缀和相关的知识,希望对你有一定的参考价值。

题目:

 

思路:把\'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;
} 

 

以上是关于51nod 1393 0和1相等串 思路 : map存前缀和的主要内容,如果未能解决你的问题,请参考以下文章

1393 0和1相等串 51nod

51nod-1396还是01串

51nod 还是01串

AC日记——N的倍数 51nod 1103

51nod 1103 N的倍数 思路:抽屉原理+前缀和

51nod 1092(lcs)回文字符串