首页 > 其他 > 详细

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

时间:2017-08-22 20:35:40      阅读:1145      评论:0      收藏:0      [点我收藏+]

题目:

技术分享

 

思路:把‘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存前缀和

原文:http://www.cnblogs.com/zhangjiuding/p/7413461.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!