B. Sereja ans Anagrams----map维护queue

来源:互联网 发布:淘宝身高体重尺码表 编辑:程序博客网 时间:2024/06/07 10:59

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

题目链接:http://codeforces.com/contest/367/problem/B


题目的意思是说给定n个元素的序列a[]和m个元素的序列b[],让你找到一个q使得a[q]、a[q+p]、…a[q+(m-1)*p]构成序列b。问你所有的q。


这个题做的和个傻子似的。。题解是看懂了,但是可能再碰到这种题还是不会。。还要加强反思。

http://blog.csdn.net/chenzhenyu123456/article/details/51038991

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <map>#define LL long longusing namespace std;const int mod=1e9+7;void add(LL &x, LL y){    x+=y;    x%=mod;}int a[300000];map<int, int>fp,tp;int n,m,p;int ans;bool vis[300000];void solve(int s){    tp.clear();    queue<int>Q;    for(int i=s;i<=n;i+=p){        Q.push(i);        tp[a[i]]++;        if(Q.size()==m){            if(fp==tp){                vis[Q.front()]=true;                ans++;            }            int v=a[Q.front()];            Q.pop();            if(--tp[v]==0){                tp.erase(v);            }        }    }}int main(){    scanf("%d%d%d",&n,&m,&p);    for(int i=1;i<=n;i++){        scanf("%d",&a[i]);        vis[i]=false;    }    fp.clear();    for(int i=1;i<=m;i++){        int b;        scanf("%d",&b);        fp[b]++;    }    ans=0;    for(int i=1;i<=p;i++){        solve(i);    }    printf("%d\n",ans);    int cnt=0;    for(int i=1;i<=n;i++){        if(vis[i]){            if(cnt>0)                printf(" ");            printf("%d",i);            cnt++;        }    }    if(ans)        printf("\n");    return 0;}


原创粉丝点击