您的位置:首页 > 其它

Sereja ans Anagrams

2017-03-11 00:27 471 查看
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.

Example

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

题意 给出a b两个字符串,还有k间隔。

从a中把每k个间隔的字符连在一起(随便排序),问能组成b的起点位置有多少个。stl的应用,关于map,当map里面的元素相等而且个数相等的时候map类型会完全相等。当元素为0的时候一定要用st.erase(元素值)删除。这样时间复杂度是on

#include <bits/stdc++.h>
using namespace std;
int n,m,p;
bool vis[201010];
int a[201010];
map<int,int> mp,tp;
int ans=0;
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)
{
i
4000
f(mp==tp)
{
vis[Q.front()]=1;
ans++;
}
int v=a[Q.front()];Q.pop();
if(--tp[v]==0) tp.erase(v);
}
}
}
int main()
{
cin>>n>>m>>p;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
vis[i]=false;
}
for(int i=1;i<=m;i++)
{
int x;
cin>>x;
mp[x]++;
}
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++;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: