CodeForces 367B. Sereja ans Anagrams(经典STL)
来源:互联网 发布:单片机usb驱动下载 编辑:程序博客网 时间:2024/05/27 00:58
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.
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 11 2 3 2 11 2 3
21 3
6 3 21 3 2 2 3 11 2 3
21 2
【分析】 因为p给定了,所以只需要使头元素从1到p,并使后面m-1个元素都相互间隔p,这样走一遍就可以在O(1)内找到目标序列,很明显用双端队列做很方便,比如有三个数1,2,3,现在要找下一个序列,我们只需要把下一个符合条件的元素加到队列末尾,同时吧队首元素删除就可以了。
过程看代码:
#include<iostream>#include<cstdio>#include<cstring>#include<map>#include<queue>#include<algorithm>using namespace std;const int N=220000;typedef map<int,int> mm;int m,n,p,a[N],ans[N];mm B;int main(){ scanf("%d%d%d",&n,&m,&p); B.clear(); for(int i=1;i<=n;i++) scanf("%d",a+i); for(int i=0;i<m;i++) { int x; scanf("%d",&x); B[x]++; } int h=0; if((m-1)*p+1>n) {printf("0\n");return 0;} for(int i=1;i<=p;i++) { deque<int> q; mm xx; xx.clear(); for(int j=i;j<=n;j+=p) { q.push_back(j); xx[a[j]]++; if(q.size()>m) { int w=q.front();q.pop_front(); xx[a[w]]--;//一定要减去这个数的次数。 if(xx[a[w]]==0) { xx.erase(a[w]); } } if(xx==B) ans[h++]=q.front(); } } sort(ans,ans+h); if(!h) printf("0\n"); else{ printf("%d\n%d",h,ans[0]); for(int i=1;i<h;i++) printf(" %d",ans[i]); printf("\n"); } return 0;}
- CodeForces 367B. Sereja ans Anagrams(经典STL)
- CodeForces 367B. Sereja ans Anagrams
- Sereja ans Anagrams - CodeForces 367B 水题
- CodeForces 367B Sereja ans Anagrams
- codeforces 367B Sereja ans Anagrams
- CodeForces - 367B Sereja ans Anagrams (map)
- Codeforces 367B Sereja ans Anagrams 【map维护queue】
- CodeForces 367B Sereja ans Anagrams (map)
- 解题报告:CodeForces 367B Sereja ans Anagrams
- Sereja ans Anagrams CodeForces
- Sereja ans Anagrams ------Codeforces Round # 215 div.1 B
- Codeforces--367D--D. Sereja ans Anagrams(STL)(模拟)
- Codeforces 367B Sereja ans Anagrams 详细题解(map应用+维护长度)
- Codeforces Round #215_div2_D. Sereja ans Anagrams
- B. Sereja ans Anagrams----map维护queue
- Sereja ans Anagrams
- Sereja ans Anagrams
- Sereja ans Anagrams(map)
- js日历控件的使用方法
- 设计模式--静态代理模式详解
- 十、JVM常用启动参数
- 简单了解Python
- Linux系统下将程序中的数据写入gunplot并绘图
- CodeForces 367B. Sereja ans Anagrams(经典STL)
- Hive与Hbase的区别以及两者的应用场景
- 表头、表尾固定 表中数据有滚动轴
- Spark中ml和mllib的区别
- QToolBox使用整理
- 【Lca 在线st算法】hdu 2586 How far away ?
- 去除ipone/ipad 手机端网页默认button的样式
- ZOJ3856 Goldbach[FFT]
- Jfree实现统计图