codeforces 367B

来源:互联网 发布:特步官方旗舰店淘宝 编辑:程序博客网 时间:2024/05/21 18:00

题目链接:

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");    }}