codeforces1186C Vus the Cossack and Strings 思维

网址:https://codeforces.com/problemset/problem/1186/C

题意:

给出$01$串$s$和$t$,$f(c,d)$表示字符串$c$和$d$的对应位置不相等的个数,求$\sum f(substring(s),t)[f(substring(s),t)=0(mod2)]$。

题解:

别问,问就暴力,卡了很久只能去看题解,然后发现还可以这样做:我们先把字符串搞成相同,然后我们发现,只有字符串的任意两位互换字符或者同时改变两个相同的字符,对应位置不相等的个数才有可能是偶数,所以就是$f(c,d)$为偶数的充要条件是$(\sum c_1)(mod2)=(\sum d_1)(mod2)$,对于字符串$s$,前缀和处理一下$1$的数量,然后遍历一遍即可。

AC代码:

#include <bits/stdc++.h>
using namespace std;
int sum[1000005];
int main()
{
    string s,t;
    cin>>s>>t;
    sum[0]=0;
    for(int i=0;i<s.size();++i)
        sum[i+1]=sum[i]+(s[i]=='1'?1:0);
    int ss=0;
    for(int i=0;i<t.size();++i)
        ss+=t[i]=='1'?1:0;
    int ans=0;
    for(int i=t.size();i<=s.size();++i)
        if((sum[i]-sum[i-t.size()])%2==ss%2)
            ++ans;
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2019-08-11 21:11  Aya_Uchida  阅读(194)  评论(0编辑  收藏  举报