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](代码片段

c_cpp Codeforces片段

Codeforces 86C Genetic engineering(AC自动机+DP)

CodeForces 1005D Polycarp and Div 3(思维贪心dp)

(Incomplete) Codeforces 394 (Div 2 only)

CodeForces 931F Teodor is not a liar!