Codeforces Round #215 (Div. 1) B. Sereja ans Anagrams 匹配
2015-07-03 15:26
316 查看
B. Sereja ans Anagrams
Time Limit: 20 SecMemory Limit: 256 MB
题目连接
http://codeforces.com/problemset/problem/367/BDescription
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.
[b]Input[/b]
The first line of the input data contains the single integer n (1 ≤ n ≤ 50) — the number of commands.
Then
follow n lines, each contains one command. Each of these lines contains
either command pwd, or command cd, followed by a space-separated
non-empty parameter.
The command parameter cd only contains lower
case Latin letters, slashes and dots, two slashes cannot go
consecutively, dots occur only as the name of a parent pseudo-directory.
The command parameter cd does not end with a slash, except when it is
the only symbol that points to the root directory. The command parameter
has a length from 1 to 200 characters, inclusive.
Directories in the file system can have the same names.
[b]Output[/b]
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).
[b]Sample Input[/b]
5 3 1
1 2 3 2 1
1 2 3
[b]Sample Output[/b]
2
1 3
HINT
[b]题意[/b]
给你n个a[i],m个b[i],和P
要求让你找到起点,使得a[pos],a[pos+p],a[pos+2*p]……,a[pos+(m-1)*p]和b数组一样
[b]题解:[/b]
类似于km算法
我们把b[i]表示为子串
a[i]表示为母串
因为不要求顺序,我们就直接跑就好了,只要匹配不是O(m*n)的都能过吧
[b]代码[/b]
#include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> typedef long long ll; using namespace std; //freopen("D.in","r",stdin); //freopen("D.out","w",stdout); #define sspeed ios_base::sync_with_stdio(0);cin.tie(0) #define test freopen("test.txt","r",stdin) #define maxn 1050005 #define mod 10007 #define eps 1e-9 const int inf=0x3f3f3f3f; const ll infll = 0x3f3f3f3f3f3f3f3fLL; inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } //************************************************************************************** int a[maxn]; int b[maxn]; map<int,int> H; map<int,int> H1; vector<int> ans; int main() { int n=read(),m=read(),p=read(); for(int i=1;i<=n;i++) a[i]=read(); for(int i=1;i<=m;i++) b[i]=read(),H[b[i]]++; int pos; int flag=0; for(int i=1;i<=p;i++) { H1.clear(),pos=i,flag=0;; for(int j=i;j<=n;j+=p) { H1[a[j]]++,flag++;; if(H1[a[j]]>H[a[j]]) { for(int k=pos;k<=j;k+=p) { H1[a[k]]--,flag--; if(a[j]==a[k]) { pos=k+p; break; } } continue; } if(flag==m) { ans.push_back(pos); H1[a[pos]]--; flag--; pos+=p; } } } sort(ans.begin(),ans.end()); cout<<ans.size()<<endl; for(int i=0;i<ans.size();i++) printf("%d ",ans[i]); }
相关文章推荐
- 安卓开发有道词典
- openresty安装
- Android中Cursor(游标)类的概念和用法
- Html 全屏切换效果
- Java学习笔记1:将字符串写入txt文件中
- SharedPreference , PreferenceActivity
- new 高级用法
- 再说边缘特征提取sobel算子
- Xoring Ninja
- 阿里上市的造富运动,由世界上最富有的冲击引起的,马云缩水达,儿子约峰会
- 【转】select和epoll模型的差异
- Windows7系统开机鼠标动不了是什么原因如何解决
- java 多线程
- BOA入门分析
- CreateProcess操作 SQLPLUS 执行 SQL文件
- Android onInterceptTouchEvent()和onTouchEvent()
- IOS自动化测试之UIAutomation Test学习——first step:Instrument
- oracle 创建表sql语句,主键,自增长
- Android工程文件下assets文件夹与res文件夹的区别
- [华为机试练习题]42.求二叉树的深度和宽度