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,晚上和队友看了一个多校的比赛,太自闭了。
还有些题目忘记记录了,就算啦