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 }

猜你喜欢

转载自www.cnblogs.com/yzxqq/p/11110914.html