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; }