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存前缀和的主要内容,如果未能解决你的问题,请参考以下文章