题目描述
给出长度为n的01数组,求最长的连续的01个数相同的子串的长度
思路
读入时将0换成-1
然后算出每个位置的前缀和
当前缀和相等时,那么易得这两个数之间的01个数相同
剩下就好做了
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#define ll long long
using namespace std;
struct wh_
{
int sum, id;
}F[100250];
ll n, k;
bool nm(wh_ i, wh_ j)
{
if(i.sum != j.sum)return i.sum > j.sum;
else return i.id < j.id;
}
int main()
{
scanf("%lld", &n);
for(ll i = 1; i <= n; ++i)
{
F[i].sum = F[i - 1].sum;
scanf("%lld", &k);
if(!k)k = -1;
F[i].sum += k, F[i].id = i;
}
sort(F + 1, F + n + 1, nm);
ll L = 0, R = 1;
for(ll i = 1; i < n; ++i)
{
if(F[i].sum == F[i + 1].sum)
{
int l = F[i].id, r = 0, j = i;
while(F[j].sum == F[j + 1].sum)++j;
r = F[j].id;
if(r - l > R - L)R = r, L = l;
}
}
printf("%lld", R - L);
return 0;
}