1186C - Vus the Cossack and Strings(非异或做法)

一件传送衣剑神后天

网 上 的 异 或 做 法 原 理 其 实 就 是 下 面 的 解 释 . 网上的异或做法原理其实就是下面的解释. .

统 计 a 中 某 个 子 串 1 的 数 量 记 作 n u m a 统计a中某个子串1的数量记作numa a1numa

统 计 b 串 1 的 数 量 记 作 n u m b 统计b串1的数量记作numb b1numb

当 n u m a 和 n u m b 奇 偶 性 相 同 时 , 不 管 怎 么 放 不 同 字 符 个 数 都 是 偶 数 当numa和numb奇偶性相同时,不管怎么放不同字符个数都是偶数 numanumb,

为 什 么 ? \color{Red}为什么? ?

设 有 x 个 1 放 在 同 一 个 位 置 , 也 就 是 a , b 串 都 是 1 ( 相 同 ) 设有x个1放在同一个位置,也就是a,b串都是1(相同) x1,a,b1()

那 么 有 ( n u m a − x ) + ( n u m b − x ) 位 置 是 01 或 10 的 方 式 放 置 ( 不 同 ) 那么有(numa-x)+(numb-x)位置是01或10的方式放置(不同) (numax)+(numbx)0110()

n u m a + n u m b 是 偶 数 , 2 x 是 偶 数 , 相 减 仍 然 是 偶 数 numa+numb是偶数,2x是偶数,相减仍然是偶数 numa+numb,2x,

还 有 异 或 的 做 法 , 可 以 去 看 看 其 他 博 客 。 还有异或的做法,可以去看看其他博客。 ,

#include 
using namespace std;
const int maxn=1e6+10;
char a[maxn],b[maxn];
int la,lb,numa,numb,ans;
int main()
{
	cin>>(a+1)>>(b+1);
	la=strlen(a+1),lb=strlen(b+1);
	for(int i=1;i<=lb;i++)
		numa+=a[i]-'0',numb+=b[i]-'0';
	if(numa%2==numb%2)	ans++;
	for(int i=2;i+lb-1<=la;i++)
	{
		int j=i+lb-1;
		numa=numa-(a[i-1]-'0')+(a[j]-'0');
		if(numa%2==numb%2)	ans++;
	}
	cout<

你可能感兴趣的:(CF刷题计划)