CodeForces

来源:互联网 发布:ctr预估 算法融合 编辑:程序博客网 时间:2024/06/03 20:08

题目链接:http://codeforces.com/problemset/problem/367/B点击打开链接

B. Sereja ans Anagrams
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Sereja has two sequences a and b and number p. Sequence a consists of n integers a1, a2, ..., an. Similarly, sequence b consists of mintegers b1, b2, ..., bm. As usual, Sereja studies the sequences he has. Today he wants to find the number of positions q(q + (m - 1)·p ≤ nq ≥ 1), such that sequence b can be obtained from sequence aq, aq + p, aq + 2p, ..., aq + (m - 1)p by rearranging elements.

Sereja needs to rush to the gym, so he asked to find all the described positions of q.

Input

The first line contains three integers nm and p (1 ≤ n, m ≤ 2·105, 1 ≤ p ≤ 2·105). The next line contains n integers a1a2...an(1 ≤ ai ≤ 109). The next line contains m integers b1b2...bm (1 ≤ bi ≤ 109).

Output

In the first line print the number of valid qs. In the second line, print the valid values in the increasing order.

Examples
input
5 3 11 2 3 2 11 2 3
output
21 3
input
6 3 21 3 2 2 3 11 2 3
output
21 2

一开始想法使用multiset坐 但是会超空间

用队列从1~p通过一个队列往后判断 如果当前与b数列相等 将即将入队的元素跟队首元素进行比较就可

#include <iostream>#include <queue>#include <stdio.h>#include <stdlib.h>#include <stack>#include <limits>#include <string>#include <string.h>#include <vector>#include <set>#include <map>#include <algorithm>#include <math.h>using namespace std;map<int ,int> mmap;map<int ,int>b;map<int ,int>a;map<int , int >ans;map<int ,int > :: iterator it;int main(){    int n;int m;int p;    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++)        {            int mid;            scanf("%d",&mid);            b[mid]++;        }    for(int i=1;i<=p;i++)    {        queue<int > q;        for(int j=i;j<=n;j+=p)        {            if(q.size()<m)            {                q.push(j);                mmap[a[j]]++;            }            if(q.size()==m)            {                if(mmap==b)                    ans[q.front()]++;                mmap[a[q.front()]]--;                if(!mmap[a[q.front()]])                    mmap.erase(a[q.front()]);                q.pop();            }        }        mmap.clear();    }        //cout <<endl;    cout << ans.size()<< endl;    for(it=ans.begin();it!=ans.end();it++)        cout << (*it).first <<" ";}




原创粉丝点击