cf D. Sereja ans Anagrams

http://codeforces.com/contest/368/problem/D

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <map>
 4 #include <vector>
 5 #include <algorithm>
 6 #define maxn 300000
 7 #define LL long long
 8 using namespace std;
 9 
10 int n,m,p;
11 LL a[maxn],b[maxn];
12 vector<int>g;
13 
14 int main()
15 {
16     while(scanf("%d%d%d",&n,&m,&p)!=EOF)
17     {
18         for(int i=0; i<n; i++)
19         {
20             scanf("%lld",&a[i]);
21         }
22         for(int i=0; i<m; i++)
23         {
24             scanf("%lld",&b[i]);
25         }
26         for(int i=0; i<p&&i+(LL)(m-1)*p<n; i++)
27         {
28             map<int,int>q;
29             for(int j=0; j<m; j++)
30             {
31                 q[b[j]]++;
32             }
33             int c=i;
34             for(int j=0; j<m; j++)
35             {
36                 q[a[c]]--;
37                 if(q[a[c]]==0)
38                 {
39                     q.erase(a[c]);
40                 }
41                 c+=p;
42             }
43             for(int j=i; ; j+=p,c+=p)
44             {
45                 if(!q.size()) g.push_back(j+1);
46                 if(c>=n) break;
47                 if(--q[a[c]]==0) q.erase(a[c]);
48                 if(++q[a[j]]==0) q.erase(a[j]);
49             }
50         }
51         sort(g.begin(),g.end());
52         printf("%d
",g.size());
53         for(int i=0; i<(int)g.size(); i++)
54         {
55             printf("%d ",g[i]);
56         }
57         printf("
");
58     }
59     return 0;
60 }
View Code
原文地址:https://www.cnblogs.com/fanminghui/p/3962239.html