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 题意:一堆人坐成一个环,问能否按逆时针或者顺时针 ...
随机推荐
- hdu 3590 PP and QQ
知识储备: Anti-SG 游戏和 SJ 定理 [定义](anti-nim 游戏) 桌子上有 N 堆石子,游戏者轮流取石子. 每次只能从一堆中取出任意数目的石子,但不能不取. 取走最后一 ...
- ps -ef能列出进程号,和端口号没任何关系
1.ps -ef显示所有进程ID 2.netstat才显示端口号情况
- React组件-mixin
一.组件 二.代码 <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&q ...
- ps 快捷键
1.前景色填充ALT+DEL 2.背景色填充CTRL+DEL 3.按D键可以以恢复默认的前景色(黑).背景色(白). 4.按X键可以切换前景色.背景色.
- Spring笔记——Spring框架简介和初次框架配置
Spring简介 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Deve ...
- Redis的List操作
lpush key value 作用: 把值插入到链接头部 127.0.0.1:6379> lpush character a (integer) 1 127.0.0.1:6379> rp ...
- android sqlite 怎么写入存储时间
字符串类型2013-12-10 12:12:12 SimpleDateFormat formatter = new SimpleDateFormat ("yyyy-MM-dd"); ...
- 查找当前SQL Server下的Active Session正连接着哪个数据库
今天碰到个事.原本想把数据库设为单用户模式然后把REMOVE FILE.没想到悲剧了.因为很多进程都是需要远程连接这个库,导致别的进程抢在我前面连接了这个数据库,反到我连不上了.想把数据库切回MULT ...
- CMake入门指南-编译教程
CMake是一个比make更高级的编译配置工具,它可以根据不同平台.不同的编译器,生成相应的Makefile或者vcproj项目.通过编写CMakeLists.txt,可以控制生成的Makefile, ...
- HDU 1054:Strategic Game
Strategic Game Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...