题目链接:
https://www.51nod.com/onlineJudge/submitDetail.html#!judgeId=424616
题解:
很好的一道思维题,自己一开始的想法就是dp,但是范围比较大,也没什么好的想法。后来又想用二分,但没什么用(范围还是太大),最后看到了大佬的思路,因为数的种类比较少,直接进行+和-的操作就能纪录所有的状态,学到了。
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
#define inf 0x3f3f3f3f
const int maxn = 1e6+10;
int num[2*maxn];
string s;
int main()
{
cin>>s;
int n=(int)s.size();
met(num,-1);
num[n]=0;//ps:需要注意对于的第一个的时候,要进行判断的,不然会先0111111这种情况
int cnt=n;
int ans=0;
for(int i=0;i<n;i++)
{
if(s[i]=='1')
cnt++;
else
cnt--;
if(num[cnt]!=-1)
ans=max(ans,i-num[cnt]+1);//这里原来的初始化都是-1,所以,使用的时候需要在坐标的基础上+1
else
num[cnt]=i+1;
}
printf("%d\n",ans);
}