基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
收藏
关注
给定一个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
技巧题,一开始想过用结构数组保存,然后找下规律,后来发现只要找到规则就直接过了
首先有n个点,第k点的左边的0和右边的1一样多
那么我们设: n个点,其中为1的点一共有x个 , 第k点为答案
1: 第k点的左边的1的数目为x1, 那么左边的0的数目为 k-x1 ; (左边一共有k个点)
2: 右边为1的点有 x-x1; (为1的总数减去左边为1的点)
3: 回到题目 k-x1 == x-x1, 那么可得 k=x;
所以答案k就是点数为1 的个数。
献上代码:
#include<cstdio>
#include<mem.h>
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
char str[1000005];
cin>>str;
int leng=strlen(str);
int num1=0;
for(int i=0;i<leng;i++)
if(str[i]=='1')
num1++;
cout<<num1;
return 0;
}

本文探讨了一种特定的01串匹配问题,通过巧妙的方法快速找出满足条件的位置k,使得左侧0的数量等于右侧1的数量。该问题适用于编程竞赛及算法训练。
4563

被折叠的 条评论
为什么被折叠?



