codeforce1186C Vus the Cossack and Strings

问题链接(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值