题目链接
题意:给定一个01串,要你找到最长的子串,子串需满足0和1的差为0.
思路:将0设为-1,1设为1,计算前缀和,如果某个位置的前缀和第一次出现的位置就是一个满足条件的子串或者前缀和为0的位置。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
char s[maxn];
int dp[maxn];
map<int,int>p;
int main()
{
int n,ans=0;
scanf("%d",&n);
scanf("%s",s+1);
for(int i=1;i<=n;++i)
{
dp[i]=dp[i-1]+((s[i]==s[1])?1:-1);
if(!p[dp[i]]) p[dp[i]]=i;
ans=max(ans,i-p[dp[i]]);
if(dp[i]==0) ans=max(ans,i);
}
printf("%d\n",ans);
}