Codeforces 367B Sereja ans Anagrams 【map维护queue】

题目链接:Codeforces 367B Sereja ans Anagrams

B. Sereja ans Anagrams
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard 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 m integers 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 ≤ n; q ≥ 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 n, m and p (1 ≤ n, m ≤ 2·105, 1 ≤ p ≤ 2·105). The next line contains n integers a1, a2, …, an (1 ≤ ai ≤ 109). The next line contains m integers b1, b2, …, 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 1
1 2 3 2 1
1 2 3
output
2
1 3
input
6 3 2
1 3 2 2 3 1
1 2 3
output
2
1 2

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

思路:i、i+p、i+2*p肯定构成一条长链,枚举链的起点,用一个queue来维护元素的进出,每当queue里面有m个元素,用map判定是否满足。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#define PI acos(-1.0)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define fi first
#define se second
#define ll o<<1
#define rr o<<1|1
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int MAXN = 2*1e5 + 10;
const int pN = 1e6;// <= 10^7
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
void add(LL &x, LL y) { x += y; x %= MOD; }
int a[MAXN];
map<int, int> fp, tp;
int n, m, p;
int ans;
bool vis[MAXN];
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;
}

你可能感兴趣的:(Codeforces 367B Sereja ans Anagrams 【map维护queue】)