Educational Codeforces Round 30 B. Balanced Substring(前缀和+思维)

题目链接
在这里插入图片描述
题意:给定一个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);
}
发布了328 篇原创文章 · 获赞 1 · 访问量 9084

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/105279620