C. Vus the Cossack and Strings
作者:互联网
1 /******* 2 http://codeforces.com/contest/1186/problem/C 3 题意:给2个0,1串,a串比b串长。 4 问a串有多少个和b串等长且不同的字符个数为偶数的串。 5 思路:首先比较出a中第一个串(记为a0)和b的不同字符个数(记为ans0)。然后a中第二个串(记为a1)将不在与b比较而是与a中第一个串比较。 6 这里分2种情况:(1):a1[i]==a0[i]时不用管;(因为此情况时,无论a0[i]与b[i]是否相同,a1[i]与b[i]的情况都与前者一样) 7 (2):a1[i]!=a0[i]时记录这种情况个数(记为s1)。(a1[i]与b[i]的情况恰好与a0[i]与b[i]的情况相反) 8 如果(ans0+s1)%2==0该串就是答案之一; 9 那么对于任意一个a的与b大小相等的串到底是不是答案,我们都可以通过(前一个串的不同字符个数+该串中(2)情况的个数)来判断。 10 而对于任意一个串, (2)情况的个数,都可以通过预处理0(1)出来。 11 ****/ 12 13 14 #include<bits/stdc++.h> 15 using namespace std; 16 int s[1000009],ans[1000009]; 17 int main() 18 { 19 string sa,sb; 20 int la,lb; 21 cin>>sa>>sb; 22 la=sa.size( ),lb=sb.size(); 23 s[0]=0; 24 for(int i=1;i<la;i++) 25 { 26 if(sa[i]==sa[i-1])s[i]=s[i-1]; 27 else s[i]=s[i-1]+1; 28 } 29 int k=0; 30 for(int i=0;i<lb;i++) 31 { 32 if(sa[i]!=sb[i])ans[lb-1]++; 33 } 34 if(ans[lb-1]%2==0)ans[lb-1]=0; 35 for(int i=lb;i<la;i++) 36 { 37 ans[i]=(ans[i-1]+s[i]-s[i-lb])%2; 38 } 39 int tans=0; 40 for(int i=lb-1;i<la;i++) 41 { 42 if(ans[i]==0) tans++; 43 } 44 cout<<tans<<endl; 45 return 0; 46 }
标签:int,个数,a1,a0,Vus,sa,Cossack,Strings,记为 来源: https://www.cnblogs.com/yzxqq/p/11110914.html