2019.7.10

2019.7.10

cf #571 div2 C

字符串a中与b相等长度的子串中,有多少个与b有偶数个不同的字符。(字符串只含01)

思路:cnta, cntb表示字符串的和,因为a对b只有(00)(11)(01)(10)四种情况,所以如果要存在偶数个不同,(cnta+cntb)% 2 == 0满足;

#include <cstdio>
#include <cstring>

char a[1000010], b[1000010];
int cnta[1000010];
int main() {
    while(~scanf("%s %s", a, b)) {
        int n = strlen(a), m = strlen(b);
        cnta[0] = a[0] - '0';
        int cntb = 0;
        for(int i = 0; i < m; i++) {
            if(b[i] == '1') cntb++;
        }
        for(int i = 1; i < n; i++) {
            if(a[i] == '1') cnta[i] = cnta[i-1] + 1;
            else cnta[i] = cnta[i-1];
        }
        int cnt = 0;
        if((cnta[m-1] + cntb) % 2 == 0) cnt++;
        for(int i = m; i < n; i++) {
            if((cntb + cnta[i] - cnta[i-m]) % 2 == 0) cnt++;
        }
        printf("%d
", cnt);
    }
    return 0;
}

cf 1152A

有n个箱子和m把钥匙,箱子的数字和钥匙的数字相加是奇数就可以打开箱子,问最多有多少个箱子可以打开,钥匙只能用一次。

#include <cstdio>
#include <algorithm>
using namespace std;
int main() {
    int n, m;
    while(~scanf("%d %d", &n, &m)) {
        int ll = 0, rr = 0, l = 0, r = 0, a;
        for(int i = 0; i < n; i++) {
            scanf("%d", &a);
            if(a % 2) l++;
            else r++;
        }
        for(int i = 0; i < m; i++) {
            scanf("%d", &a);
            if(a % 2) ll++;
            else rr++;
        }
        int ans = min(l, rr) + min(r, ll);
        printf("%d
", ans);
    }
    return 0;
}

今天没写多少题是因为今天集训打了一场cf,晚上和队友看了一个多校的比赛,太自闭了。

还有些题目忘记记录了,就算啦

原文地址:https://www.cnblogs.com/fanshhh/p/11172227.html