Codeforces Round #215 (Div. 2) D题(离散化+hash)
1 second
256 megabytes
standard input
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 ≤ 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.
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).
In the first line print the number of valid qs. In the second line, print the valid values in the increasing order.
5 3 1 1 2 3 2 1 1 2 3
2 1 3
6 3 2 1 3 2 2 3 1 1 2 3
2 1 2
题意:很容易理解。
分析:离散化->用hash进行线性求解
比赛的时候没有做出来,后来看了别人的思路,然后自己敲了遍代码,贡献了一次超时和两次Runtime Error,不过从中也得到一些收获,题目中a数组和b数组的元素范围为1<=ai,bi<=10^9,此范围比较大,开数组进行hash不好弄,所以第一步就是离散化,离散化之后就是hash进行求解,实践复杂度为线性的,具体看代码实现。
代码实现:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std; int n,m,p,total,flag,now;
int a[],b[],c[],all[],visited[]; void hebing()//合并成一个数组,全部存在c数组里
{
int i,j,x;
total=;
for(i=;i<=n;i++)
c[++total]=a[i];
for(i=;i<=m;i++)
c[++total]=b[i];
sort(c+,c++total);
x=;
for(i=;i<=total;i++)//去重
if(i==||c[i]!=c[i-])
c[++x]=c[i];
total=x;
} int find(int x)//二分查找x处在c数组中的位置
{
int l=,r=total+,mid;
while(l<=r)
{
mid=(l+r)>>;
if(c[mid]==x)
return mid;
else if(c[mid]>x)
r=mid-;
else
l=mid+;
}
} void lisanhua()//对a数组和b数组进行离散化
{
int i;
for(i=;i<=n;i++)
a[i]=find(a[i]);
for(i=;i<=m;i++)
b[i]=find(b[i]);
} void init()
{
int i;
flag=;
memset(all,,sizeof(all));
for(i=;i<=m;i++)//哈希处理b数组的情况
{
if(all[b[i]]==)
flag++;
all[b[i]]++;
}
} void add(int x)
{
visited[x]++;
if(visited[x]==all[x])
now++;
} void del(int x)
{
visited[x]--;
if(visited[x]+==all[x])
now--;
} void solve()
{
int res[],num=,i,j,k;
for(i=;i<=p;i++)//因为相隔为p,所以只需枚举1-p,然后对每一种序列滚动过去
{
if((i+(long long)(m-)*p)<=n)//因为(m-1)*p已经超过int型,所以要强制转换成long long
{ //否则就会出现Runtime Error
now=;
for(j=;j<m;j++)
add(a[i+j*p]);
if(now==flag)
res[num++]=i;
for(j=i+p;(j+(long long)(m-)*p)<=n;j=j+p)//滚动过去
{
del(a[j-p]);
add(a[j+(m-)*p]);
if(now==flag)
res[num++]=j;
}
for(k=;k<m;k++)//把加了的删掉,开始我用了memset(visited,0,sizeof(visited));
del(a[j-p+k*p]);//然后果断超时了
}
}
printf("%d\n",num);
sort(res,res+num);
for(i=;i<num;i++)
if(i!=num-)
printf("%d ",res[i]);
else
printf("%d\n",res[i]);
} int main()
{
int i,j;
scanf("%d%d%d",&n,&m,&p);
{
for(i=;i<=n;i++)
scanf("%d",&a[i]);
for(i=;i<=m;i++)
scanf("%d",&b[i]);
hebing();
lisanhua();
init();
solve();
}
return ;
}
Codeforces Round #215 (Div. 2) D题(离散化+hash)的更多相关文章
- Codeforces Round #612 (Div. 2) 前四题题解
这场比赛的出题人挺有意思,全部magic成了青色. 还有题目中的图片特别有趣. 晚上没打,开virtual contest打的,就会前三道,我太菜了. 最后看着题解补了第四道. 比赛传送门 A. An ...
- Codeforces Round #378 (Div. 2) D题(data structure)解题报告
题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...
- Codeforces Round #713 (Div. 3)AB题
Codeforces Round #713 (Div. 3) Editorial 记录一下自己写的前二题本人比较菜 A. Spy Detected! You are given an array a ...
- Codeforces Round #552 (Div. 3) A题
题目网址:http://codeforces.com/contest/1154/problem/ 题目意思:就是给你四个数,这四个数是a+b,a+c,b+c,a+b+c,次序未知要反求出a,b,c,d ...
- Codeforces Round #412 Div. 2 补题 D. Dynamic Problem Scoring
D. Dynamic Problem Scoring time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- Codeforces Round #361 (Div. 2) 套题
A - Mike and Cellphone 问有没有多解,每个点按照给出的序列用向量法跑一遍 #include<cstdio> #include<cstring> #incl ...
- Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)
题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...
- Codeforces Round #425 (Div. 2))——A题&&B题&&D题
A. Sasha and Sticks 题目链接:http://codeforces.com/contest/832/problem/A 题目意思:n个棍,双方每次取k个,取得多次数的人获胜,Sash ...
- Codeforces Round #579 (Div. 3) 套题 题解
A. Circle of Students 题目:https://codeforces.com/contest/1203/problem/A 题意:一堆人坐成一个环,问能否按逆时针或者顺时针 ...
随机推荐
- tomcat console
1.大家都知道,在Tomcat5及其以后的版本中,当启动tomcat之后,是看不到控制台中的manager应用的.Manager的应用还是很有好处的,可以直接在控制台上(类似于weblogic上的co ...
- 转:Move all SQL Server system databases at one time
Problem One task that you may need to do as a DBA is to move the system databases from one location ...
- photoshop:找不到增效工具入口点
按Ctrl+k+9 ,到预设的增效工具栏设置为要存储的文件夹路径:
- Codecademy For Python学习笔记
一.Python Lists and Dictionaries: 1. 2.
- 二维码工具类 - QrcodeUtils.java
二维码工具类,提供多种生成二维码.解析二维码的方法,包括中间logo的二维码等方法. 源码如下:(点击下载 - QrcodeUtils.java.MatrixToImageWriterEx.java. ...
- VIM的配置文件(vimrc)在哪里?【Win7】
如果你使用VIM有一段时间的话,你会想要修改它的一些配置,例如默认显示行号.在哪改呢? 答案是:vimrc 那这个配置文件在哪呢? 打开你的vi,在命令模式下,输入[:version],会看到如下图所 ...
- 《c程序设计语言》读书笔记--统计字符数
#include <stdio.h> #define MAXLINE 1000 int getline(char line[],int maxline); void copy(char t ...
- 13.allegro 颜色设置[原创]
1. -- 或者: 2. -- 3. -- 4. 5. 6. 7. 8. 9. 10. -- 11.颜色保存: -- 12. 板子做好后,visibility查看 13.飞线显示: --------- ...
- Client-Side UI Automation Provider - WinForm Sample
Client-Side UI Automation Provider - WinForm Sample 2014-09-15 源代码 目录 引用程序集实现提供程序接口分发客户端提供程序注册和配置客户 ...
- asp.net页面过滤所有换行符和多余空格
不知道大家注意到了没有,Google和Baidu网页的HTML源代码是混合在一起的.HTML代码混合在一起,出发点是为了减小网页体积,从而加快网页加载速度. 写个函数把网页HTML源代码的换行符和空格 ...