问题 D: 又是01串

题目描述

给定一个0-1串s,长度为n,下标从0开始,求一个位置k,满足0<=k<=n, 并且子串s0..k−1中的0的个数与子串sk..n−1中1的个数相等。 注意:
(1) 如果k = 0, s0..k−1视为空串
(2) 如果k = n, sk..n−1视为空串
(3) 如果存在多个k值,输出任何一个都可以 
(4) 如果不存在这样的k值,请输出-1

输入

就一行,包含一个0-1串S,长度不超过1000000。

输出

题目要求的k值

样例输入

01

样例输出

1

设所有数字和为sum,k位置断开,前半段和为i,后半段为sum - i;前半段有sum - i 个 0 (题设条件),有k - sum + i 个 1,由于和为i,所以 k - sum + i = i,得 k = sum

我是根据我的错误代码随便输串,发现的这个规律,错了n次。发现原来是个这样的规律,贼难受

AC代码:

# include <stdio.h>
# include <string.h>
	
char a[1000001];

int main(void)
{
	
	int q, d, i;
	while (~ scanf("%s", a))
	{
		q = 0;
		d = strlen(a);
		for (i = 0; i < d; i ++)
		{
			if (a[i] == '1')
				q ++;
		}
		printf("%d\n", q);
	}
	return 0;
}

自己写的时间超限:


# include <stdio.h>
# include <string.h>
	
char a[1000001];
int b[1000001], c[1000001];

int main(void)
{
	
	int q, w, i, d, k, k1, sum, sum1, qwe;
	while (~ scanf("%s", a))
	{
		memset(b, 0, sizeof(b));
		memset(c, 0, sizeof(c));
		q = 0; w = 0;
		d = strlen(a);
		for (i = 0; i < d; i ++)
		{
			if (a[i] == '0')
				b[q ++] = i;
			else 
				c[w ++] = i;
		}
		qwe = 0;
		for (i = 1; i < d; i ++)
		{
			k = 0; k1 = 0;
			while (b[k] < i)
			{
				if (k == q)
					break;
				k ++;
			}
			sum = k;
			while (c[k1] < i)
			{
				k1 ++;
				if (k1 == w)
					break;
			}
			sum1 = w-k1;
			if (sum == sum1)
			{
				printf("%d\n", i);
				qwe = 1;
				break;
			}
		}	
		if (qwe == 0 && d == 1)
				printf("-1\n");
	}
	return 0;
}



猜你喜欢

转载自blog.csdn.net/liu344439833/article/details/80306238