题目链接


Solution 1


手动操作具体可以参照下面的代码
AC代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
char a[maxn],b[maxn];
int main(){
	scanf("%s%s",a,b);
	int nb=strlen(b),na=strlen(a),bnum=0,ans=0;
	int p1=0,p2=nb-1,temp=0;
	for(int i=1;i<nb;i++)
		if(b[i-1]!=b[i]) bnum++;
///手动更新开头与结尾
	for(int i=0;i<nb;i++)
		if(a[i]!=b[i]) temp++;
	if(temp%2==0) ans++;
	for(int i=nb;i<na;i++){
		if(b[p1]!=a[i-nb]) temp++;
		if(b[p2]!=a[i]) temp++;
		temp=(temp+bnum)%50;
		if(temp%2==0) ans++;
	}
	printf("%d\n",ans);
	return 0;
}

Solution 2

因此,当我们维护ans的时候只需要关心当前a串与b串的1的个数之和的奇偶性
AC代码

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
char a[maxn],b[maxn];
int main(){
	scanf("%s%s",a,b);
	int nb=strlen(b),na=strlen(a);
	int num=0,temp=0,ans=0;
	for(int i=0;i<nb;i++){
		if(b[i]=='1') num++;
		if(a[i]=='1') temp++;
	}
	if((num+temp)%2==0) ans++;
	for(int i=nb;i<na;i++){
		if(a[i-nb]=='1') temp--;
		if(a[i]=='1')  temp++;
		if((num+temp)%2==0) ans++;
	}
	printf("%d\n",ans);
	return 0;
}