LGP1114 “非常男女”计划 学习笔记
LGP1114 “非常男女”计划 学习笔记
题意简述
给定一个长为 \(n\) 的 \(\texttt{01}\) 序列。需要找出一个区间满足其中 \(\texttt{0}\) 与 \(\texttt{1}\) 数量相等,问这个区间最长可以有多长。
\(n\le 10^5\)。
做法解析
你记录每个前缀中两种码出现次数的差值,如果有两个下标满足其值相同,说明其间两种码的出现次数相同。原理就这,接下来的不需要我赘述了吧。
代码实现
#include <bits/stdc++.h>
using namespace std;
using namespace obasic;
const int MaxN=1e5+5;
int N,A[MaxN],csum,Vp=1e5,ans;
vector<int> buc[MaxN<<1];
int main(){
readi(N);buc[Vp].push_back(0);
for(int i=1;i<=N;i++)readi(A[i]),csum+=(A[i]?1:-1),buc[csum+Vp].push_back(i);
for(int i=0;i<=Vp*2;i++){
int csiz=buc[i].size();
if(csiz)maxxer(ans,buc[i][csiz-1]-buc[i][0]);
}
writi(ans);
return 0;
}
反思总结
某种意义上这也是一种和哈希思想,此事在CSP那道消消乐里亦有记载。
浙公网安备 33010602011771号