Uva12174

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 const int maxn = 5000000;
 6 
 7 int t; 
 8 
 9 int s,n;
10 
11 int a[maxn+10];
12 
13 int res[maxn+10];
14 
15 int flag[maxn+10];
16 
17 void init(){
18     memset(a, 0, sizeof(a));
19     memset(res, 0, sizeof(res));
20     memset(flag, 0, sizeof(flag));
21 }
22 
23 
24 
25 int main(){
26 //freopen("a.txt", "w", stdout);
27     scanf("%d",&t);
28     while(t--){
29         init();
30         scanf("%d%d",&s, &n);
31         for(int i = 1; i <= n; ++i){
32             scanf("%d",&a[i]);
33         }
34         for(int i = 1; i <= s; ++i){
35             a[i+n] = i + maxn/10;
36         }
37 
38         int temp = s;
39         for(int i = 1; i <= n+s-1; ++i){
40                 if(i <= s){
41                     
42                     temp -= 1;
43                     flag[a[i]] += 1;
44                     
45                     if(flag[a[i]] == 1){
46                         temp += 1;
47                     } else if(flag[a[i]] == 2){
48                         temp -= 1;
49                     }
50                     if(temp == s){
51                 
52                         res[i] = 1;
53                     }
54                 } else {
55                     
56                     flag[a[i-s]] -= 1;
57                     
58                     if(flag[a[i-s]] == 0){
59                         temp -= 1;
60                     } else if(flag[a[i-s]] == 1){
61                         temp += 1;
62                     }
63                     
64                     flag[a[i]] += 1;
65                     if(flag[a[i]] == 1){
66                         temp += 1;
67                     } else if(flag[a[i]] == 2){
68                         temp -= 1;
69                     }
70                     
71                     if(temp == s){
72                         
73                         res[i%s] = res[i%s]&1;
74                     } else {
75                         res[i%s] = 0;
76                     }
77                 } 
78         }
79 
80         int ans = 0;
81         if(n <= s && res[n] == 1){
82             ans = s;
83         } else {
84         for(int i = 1; i <= s; ++i){
85                 if(res[i] == 1){
86                     ++ans;
87                 }
88         }
89     }
90         printf("%d
",ans);
91 
92     }
93 }
原文地址:https://www.cnblogs.com/GeniusYang/p/6864381.html