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