https://ac.nowcoder.com/acm/contest/883/B
题意:给定一个只含有01的字符串 求01相等的最长子串和最长子序列
子序列明显是01中出现较少的数字
子串的求法参考代码吧
两个前缀和相等说明 两个前缀和之间的01个数相等 因为既然前缀和相等 那么其中的01必定相等 而前缀和相等的这一段序列中 只有 01个数相等才能保证前缀和相等 了不起的做法!
#include<algorithm>
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<ctime>
#include<map>
#include<stack>
#include<set>
#include<cstring>
#include<sstream>
#include<queue>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
map<int, int> mp;
int a[maxn];
int n;
char s[maxn];
int main() {
cin >> n;
cin >> s + 1;
for (int i = 1; i <= n; i++) {
a[i] = a[i - 1] + ((s[i] == '1') ? 1 : -1);
}
int ans = 0;
mp[0] = 0;
for (int i = 1; i <= n; i++) {
if (mp.find(a[i]) != mp.end()) {//寻找这个前缀和第一次出现的位置
ans = max(ans, i - mp[a[i]]);//两次位置之差 即这一段距离
}
else {//如果不存在 则存入
mp[a[i]] = i;
}
}
int zero = 0;
int one = 0;
for (int i = 1; i <= n; i++)
if (s[i] == '0') zero++; else one++;
printf("%d %d\n", ans, min(zero, one) * 2);
return 0;
}







Comments | NOTHING