2016 ccpc长春现场赛I Sequence I(hdu 5918)
2016-10-04 12:22
489 查看
Sequence I
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 0 Accepted Submission(s): 0
Problem Description
Mr. Frog has two sequences a1,a2,⋯,an and b1,b2,⋯,bm and
a number p. He wants to know the number of positions q such that sequence b1,b2,⋯,bm is
exactly the sequence aq,aq+p,aq+2p,⋯,aq+(m−1)p where q+(m−1)p≤n and q≥1.
Input
The first line contains only one integer T≤100,
which indicates the number of test cases.
Each test case contains three lines.
The first line contains three space-separated integers 1≤n≤106,1≤m≤106 and 1≤p≤106.
The second line contains n integers a1,a2,⋯,an(1≤ai≤109).
the third line contains m integers b1,b2,⋯,bm(1≤bi≤109).
Output
For each test case, output one line “Case #x: y”, where x is the case number (starting from 1) and y is the number of valid q’s.
Sample Input
2
6 3 1
1 2 3 1 2 3
1 2 3
6 3 2
1 3 2 2 3 1
1 2 3
Sample Output
Case #1: 2
Case #2: 1
Statistic | Submit | Clarifications | Back
题意:给你两个数组,再给你距离间隔,要求你用第一个数组以一定的距离间隔匹配第二个数组,问有多少种匹配方案。
思路:现场赛的时候这道题可以暴力O(n*m)过的,但估计这道题想考的是kmp,把kmp模板改一下就好了,kmp的时间复杂度是O(n),别问我为什么暴力比kmp速度更快。下面给代码
#include<set> #include<map> #include<ctime> #include<cmath> #include<stack> #include<queue> #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> #include<functional> typedef long long LL; using namespace std; #define inf 0x3f3f3f3f #define maxn 100005 typedef long long LL; int num, sum, n, m; int next1[maxn], P[maxn], T[maxn]; void makeNext() { int q, k; next1[0] = 0; for (q = 1, k = 0; q < m; ++q) { while (k > 0 && P[q] != P[k]) k = next1[k - 1]; if (P[q] == P[k]) { k++; } next1[q] = k; } } void kmp() { int i, q; makeNext(); for (int st = 0; st < num; st++){ for (i = st, q = 0; i < n; i += num) { while (q > 0 && P[q] != T[i]) q = next1[q - 1]; if (P[q] == T[i]) { q++; } if (q == m) { sum++; } } } } int main(){ int t; scanf("%d", &t); for (int tcase = 1; tcase <= t; tcase++){ memset(P, 0, sizeof(P)); memset(T, 0, sizeof(T)); scanf("%d%d%d", &n, &m, &num); for (int i = 0; i<n; i++){ scanf("%d", &T[i]); } for (int i = 0; i<m; i++){ scanf("%d", &P[i]); } sum = 0; kmp(); printf("Case #%d: %d\n", tcase, sum); } }
相关文章推荐
- 2016 ccpc长春现场赛J Sequence II(hdu 5919)
- HDU 5918 Sequence I (2016-ccpc-长春)
- HDU 5920 Ugly Problem 高精度减法大模拟 ---2016CCPC长春区域现场赛
- HDOJ 5918 Sequence I 【2016CCPC长春现场赛】KMP暴力
- HDOJ 5914 Triangle 【2016CCPC长春现场赛】数学
- HDOJ 5912 Fraction 【2016CCPC长春现场赛】数学
- HDU 5916 Harmonic Value Description (2016-ccpc-长春)
- HDU 5918 Sequence I CCPC 长春 暴力求解
- [2016CCPC]长春现场赛重现
- Ugly Problem(hdu 5920 && 2016ICPC长春现场赛模拟题)
- HDU 5918 Sequence I【KMP?】【2016中国大学生程序设计竞赛(长春)】
- HDU 5912 Fraction (2016-ccpc-长春)
- HDU 5914 Triangle (2016-ccpc-长春)
- HDU 5918 Sequence I【暴力+剪枝】(2016中国大学生程序设计竞赛(长春)H题)
- HDU 5918 Sequence I (2016长春区域赛, KMP)
- HDOJ 5916 Harmonic Value Description 【2016CCPC长春现场赛】数学+构造
- hdu 5918 Sequence I (CCPC长春,KMP)
- hdu 5918 Harmonic Value Description 2016ACM/CCPC长春赛区现场赛H
- hdu 5914 Triangle 2016中国大学生程序设计竞赛(长春)(脑洞题)
- (HDU 5927)Auxiliary Set 思维题 <2016CCPC东北地区大学生程序设计竞赛 - 重现赛 >