CodeForces - 1186C
Posted 吃花椒的妙酱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 1186C相关的知识,希望对你有一定的参考价值。
传送门
题目大意:给定两个01串s1,s2,求s1子串与s2异或后有偶数个1,求这样的子串最多有多少个(s1不短于s2)
思路:思维
设a为s1的某个子串,c为a与s2异或后的串,当a和s1中的1数量和为偶数时,c中1的数量为偶数且数量等于a和s1中1的数量和
证明如下:设a中1的数量为x,s2中1的数量为y,a与s2中对应位置同时为1的数量为z,那么a和s2中对应位置为01或者10的位置数为 x - z + y - z = x+y -2*z =c中1的数量
所以x+y为偶数即可。
用前缀和求一下1的数量,即可得每个区间1的数量
#include <iostream>
#include <cstring>
#include <cmath>//cmath里有y1常量,避免混用
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
using namespace std;
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define pb push_back
#define IOS ios::sync_with_stdio(false)
#define int long long
typedef long long ll;
const int N=1e6+10;
char s1[N];
char s2[N];
int len1,len2;
ll ans;
int sum[N];
void solve()
{
int temp=0;
_for(i,1,len2) if( s2[i]=='1') temp++;
for(int i=1;i<=len1 ;i++)
{
sum[i]=sum[i-1] + s1[i]-'0';
}
for(int i=0 ,j=len2+i ;j<=len1;i++,j++)
{
if( (temp+ sum[j]-sum[i])%2==0 ) ans++;
}
cout<<ans<<endl;
}
signed main()
{
///!!!
// freopen("data.txt","r",stdin);
///!!!
IOS;
cin>>(s1+1);
cin>>(s2+1);
len1 =strlen(s1+1);
len2 =strlen(s2+1);
solve();
}
以上是关于CodeForces - 1186C的主要内容,如果未能解决你的问题,请参考以下文章
[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段
Codeforces 86C Genetic engineering(AC自动机+DP)
CodeForces 1005D Polycarp and Div 3(思维贪心dp)