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 题意:一堆人坐成一个环,问能否按逆时针或者顺时针 ...
随机推荐
- 如何搭建配置php开发环境
PHP的配置 1.打开解压后的C:\Program Files (x86)\php-5.3.5文件夹 1 将php.ini-development文件并更改名称为php.ini(留个备份,好习惯) 2 ...
- Centos环境下部署游戏服务器-权限
部署Web服务器的时候,在"DocumentRoot"指向的根目录新建一个文件夹,然后将网页和资源放在这个文件夹里,通过地址http://192.168.0.100/Res/ind ...
- Sublime Text 新建文件可选类型的模版插件: SublimeTmpl
安装方法: 1.Ctrl+Shift+P打开控制台, 2.输入IP安装插件 3.输入tmpl 回车安装 编辑模版在:SublimeTmpl\templates"文件夹修改 其他情况: htt ...
- Java:正则表达式的详解
正则表达式:符合一定规则的表达式. 作用:用于专门操作字符串. 特点:用一些特定的符号来表示一些代码的操作.这样就简化书写.所以学习正则表达式就是学习一些特殊符号的使用. 好处:可以简化对字符串的操作 ...
- Hadoop系列
http://www.cnblogs.com/xia520pi/archive/2012/04/08/2437875.html#2925129 hadoop提供了一个可靠的共享存储和分析系统.HDFS ...
- JQuery Selectors 方法说明
基本选择器 $("#myDiv") 匹配唯一的具有此id值的元素 $("div") 匹配指定名称的所有元素 $(".myClass") 匹配 ...
- openwrt(路由器)的源码地址
https://dev.openwrt.org/wiki/GetSource 路由器的源码地址
- ccnu-线段树-单点更新3-C
C - 单点更新3 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Des ...
- Server-Side UI Automation Provider - WinForm Sample
Server-Side UI Automation Provider - WinForm Sample 2014-09-14 源代码 目录 引用程序集提供程序接口公开服务器端 UI 自动化提供程序从 ...
- java socket编程基础
1. [代码]读操作Runable 1 package com.hrd.test.socket; import java.io.BufferedReader; import java.io.IOExc ...