码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-08-22 20:50:24      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:ring   logs   pac   负数   img   字符串转换   log   nod   else   

题目:

技术分享

 

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

标签:ring   logs   pac   负数   img   字符串转换   log   nod   else   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!