题目描述
给定一个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;
}