zoukankan      html  css  js  c++  java
  • 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 <bitsstdc++.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;
    } 
  • 相关阅读:
    UVA11039
    UVA10970大块巧克力
    UVA10970大块巧克力
    UVA10340子序列
    UVA10340子序列
    UVA10382喷水装置
    UVA10382喷水装置
    UVA10020(最小区间覆盖)
    洛谷 P2141 珠心算测验
    UVa 11292 勇者斗恶龙(The Dragon of Loowater)
  • 原文地址:https://www.cnblogs.com/zhangjiuding/p/7413461.html
Copyright © 2011-2022 走看看