51nod 0和1相等串

来源:互联网 发布:性格测试软件 编辑:程序博客网 时间:2024/05/22 04:15

题目链接:

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 0x3f3f3f3fconst 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);}
原创粉丝点击