51 nod 1396 还是01串
来源:互联网 发布:四川广电网络如何 编辑:程序博客网 时间:2024/05/13 12:07
给定一个0-1串s,长度为n,下标从0开始,求一个位置k,满足0<=k<=n, 并且子串s[0..k - 1]中的0的个数与子串s[k..n - 1]中1的个数相等。 注意:
(1) 如果k = 0, s[0..k - 1]视为空串
(2) 如果k = n, s[k..n - 1]视为空串
(3) 如果存在多个k值,输处任何一个都可以
(4) 如果不存在这样的k值,请输出-1
Input
就一行,包含一个0-1串S,长度不超过1000000。
Output
题目要求的k值
Input示例
01
Output示例
1
这个题我的做法就是记录一下前缀和,然后循环扫一遍,判断当前的位置是否是满足要去就可以咯哇。
#include<bits/stdc++.h>using namespace std;int dp0[1000005];int dp1[1000005];char s[1000005];int main(){ while(~scanf("%s",s)) { int len=strlen(s); for(int i=0; i<len; i++) { if(s[i]=='0') { if(i==0) { dp0[i]++; dp1[i]=0; } else { dp0[i]=dp0[i-1]+1; dp1[i]=dp1[i-1]; } } else { if(i==0) { dp1[i]++; dp0[i]=0; } else { dp1[i]=dp1[i-1]+1; dp0[i]=dp0[i-1]; } } }// for(int i=0;i<len;i++)// {// printf("%d %d\n",dp0[i],dp1[i]);// } int flag=0; for(int i=0;i<len;i++) { if(i==0) { if(dp1[len-1]==0){ printf("%d\n",i); flag=1; break; } } if(i==len-1) { if(dp0[len-1]==0){ printf("%d\n",len); flag=1; break; } } if(dp0[i-1]==dp1[len-1]-dp1[i-1]) { printf("%d\n",i); flag=1; break; } } if(flag==0) printf("-1\n"); } return 0;}
0 0
- 51 nod 1396 还是01串
- 51nod 1396 还是01串
- 51nod 1396 还是01串
- 51nod-【1396 还是01串】
- 51nod 1396 还是01串
- 51nod 1396 还是01串 -Zero
- 51nod oj 1396 还是01串【打表】
- 51Nod-1396-还是01串
- 51nod 1396 还是01串【前缀和】
- 51nod 1396 还是01串 (思维or前缀和)
- 51nod 1396 还是01串 【思维题】
- 51nod 1396还是01串(前缀和)
- 51nod 1396 还是01串 (根据答案推理性质)
- 51nod 1391:01串
- 51nod-1391 01串
- 51nod 1391 01串
- 51nod-1391:01串
- 51nod 1391 01串
- leetcode_349 Intersection of Two Arrays
- HDU 1019 Least Common Multiple
- SQL游标
- 找出堆中小于某个值X的所有节点
- Android21之SharedPreferences(共享偏好设置存储)
- 51 nod 1396 还是01串
- Python2.x和Python3.x的区别
- Android22之Pull解析xml
- java设计模式-外观模式
- NeuralTalk2---自动产生图片的语句描述
- leetcode_350 Intersection of Two Arrays II
- bootstrap中的dropdown组件改造click为hover
- Qt没有被正确安装
- php.ini 常用的配置