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 题意:一堆人坐成一个环,问能否按逆时针或者顺时针 ...
随机推荐
- C++函数默认参数
C++中允许为函数提供默认参数,又名缺省参数. 使用默认参数时的注意事项: ① 有函数声明(原型)时,默认参数可以放在函数声明或者定义中,但只能放在二者之一 double sqrt(double f ...
- iOS symbolicatecrash崩溃日志分析
1.保留发布程序的 .app文件 和 .dSYM文件 连同.crash文件放在同一个文件家里面. 2.在/Applications/Xcode.app/Contents/Developer/Platf ...
- 273. Integer to English Words
题目: Convert a non-negative integer to its english words representation. Given input is guaranteed to ...
- Fiddler如何抓取使用了SSL或TLS传输的Android App流量
上篇文章介绍了Burpsuite如何抓取使用了SSL或TLS传输的Android App流量, 那么使用Fiddler的时候其实 也会出现与burpsuite同样的情况,解决方案同样是需要将Fiddl ...
- Intellij IDEA的Hibernate简单应用
1.创建数据库及其表 create database demo; use demo; CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL ...
- 操刀 requirejs,自己动手写一个
前沿 写在文章的最前面 这篇文章讲的是,我怎么去写一个 requirejs . 去 github 上fork一下,顺便star~ requirejs,众所周知,是一个非常出名的js模块化工具,可以让你 ...
- wust 1061 链表的合并
怒刷存在感! ~从此wustoj踏上ty博客这样高端霸气上档次的地方啊啦啦~ 只是顺便看了下保研复试题,原来觉得链表好讨厌,现在数据结构学的没办法了,写了个大概是标准的链表合并的写法吧... #inc ...
- ubuntu 默认 进入 命令行
图形模式下,首先进入终端:1. 运行 sudo vi/etc/default/grub2. 找到 GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”3.改为 GRUB_ ...
- YTU 2611: A代码完善--向量的运算
2611: A代码完善--向量的运算 时间限制: 1 Sec 内存限制: 128 MB 提交: 256 解决: 168 题目描述 注:本题只需要提交填写部分的代码,请按照C++方式提交. 对于二维 ...
- armeabi,armeabi-v7a ,x86 和mips 都是什么?
首先要明白ABI的概念: ABI(Application Binary Interface)实际就是指应用程序基于哪种指令集来进行编译,我们能用到的ABI 也就四种 armeabi,armeabi ...