题目链接:
http://codeforces.com/contest/367/problem/B
题解:
双端队列直接维护(原来map可以直接相等,这里学到了。。。)
代码:
#include <map>
#include <cmath>
#include <deque>
#include <vector>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
#define met(a,b) memset(a,b,sizeof(a))
const int maxn = 2e5+10;
int a[maxn],b[maxn];
map<int,int>mp,np;
vector<int>pos;
int n,m,p;
int main()
{
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++)
scanf("%d", &a[i]);
for(int i=1;i<=m;i++)
{
scanf("%d",&b[i]);
mp[b[i]]++;
}
for(int i=1;i<=p;i++)
{
deque<int>q;
np.clear();
for(int j=i;j<=n;j+=p)
{
q.push_back(j);
np[a[j]]++;
if(q.size()>m)
{
int k=q.front();
q.pop_front();
np[a[k]]--;
if(np[a[k]]==0)
np.erase(a[k]);
}
if(np==mp)
pos.push_back(q.front());
}
}
sort(pos.begin(),pos.end());
int len=(int)pos.size();
printf("%d\n",len);
for(int i=0;i<len;i++)
{
printf("%d",pos[i]);
if(i!=len-1)
printf(" ");
else
printf("\n");
}
}