问题链接(https://codeforces.com/problemset/problem/1186/C)
问题描述
两个只有’0’、‘1’组成的长度相同的字符串a、b,定义了函数f(a,b)为两字符串的相同位置对应字符不相同的个数总数。现在给了两个只有’0’、‘1’组成的字符串a、b,a的长度不小于b,从a中找出一些长度与b的长度相同的子串a’,使得f(a’,b)为偶数,求这样的子串的个数。
问题分析
分别记录b中’1’的个数,a’中’1’的个数,如果差值(或和)为奇数,则它们相同位置的字符不同的个数也为奇数,如果差值(或和)为偶数,则它们相同位置的字符不同的个数也为偶数。
因为差值(或和)为奇数,说明两个串中’1’的个数奇偶不同。如果相同位置都为’1’或’0’,那么该位置字符不同的个数为0,'1’的个数差(或和)为偶数;如果相同位置的字符不同,那么该位置字符不同的个数贡献值为1,'1’的个数差(或和)为奇数。根据奇数个奇数和才为奇数,所以’1’的个数差(或和)的奇偶与相同位置的字符不同的个数的奇偶是对应的,所以统计两串中’1’的个数,判断奇偶即可。
代码如下
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int i,j,temp,len1,len2,count1,count2,sum;
string b1,b2;
cin>>b1>>b2;
len1=b1.size();
len2=b2.size();
sum=count1=count2=0;
for(i=0;i<len2;i++) {
if(b1[i]=='1') count1++;
if(b2[i]=='1') count2++;
}
temp=count2-count1;
if(temp%2==0) sum++;
for(i=0,j=len2;j<len1;i++,j++){
if(b1[i]!=b1[j]) count1++;
temp=count1-count2;
if(temp%2==0) sum++;
}
cout<<sum<<endl;
return 0;
}