HDU-5918 Sequence I(暴力)(KMP)
2016-10-05 15:40
363 查看
Sequence I
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 422 Accepted Submission(s): 158
[align=left]Problem Description[/align]
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.
[align=left]Input[/align]
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).
[align=left]Output[/align]
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.
[align=left]Sample Input[/align]
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
[align=left]Sample Output[/align]
Case #1: 2
Case #2: 1
[align=left]Source[/align]
2016中国大学生程序设计竞赛(长春)-重现赛
开始看见这个题,感觉复杂度挺模糊的,所以想暴力一发,然而自己写挫了,想了下将a数组拆开,感觉太麻烦了,就弃了,结果这两个做法都是可行的,第二种奇妙的可以用KMP,复杂度低多了。所以,有想法就要上!!!
1.暴力,直接枚举q,然后我是判断条件写挫了,看了别人的暴力好久才找到,竟然差点以为while和for有区别。This
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int N = 1000005; int a ,b ; int main() { int t,n,m,p; cin >> t; for(int ca = 1;ca <= t;ca++) { scanf("%d%d%d",&n,&m,&p); for(int i = 1;i <= n;i++) scanf("%d",&a[i]); for(int i = 1;i <= m;i++) scanf("%d",&b[i]); printf("Case #%d: ",ca); int sum = 0; for(int i = 1;i <= n && i+(m-1)*p <= n;i++) { int j = 0,r = i; while(a[r] == b[j+1]) { j++; r = i + j*p; if(j >= m) { sum++; break; } } } printf("%d\n",sum); } return 0; }
2.KMP,可以将数组抽出来,也可以将kmp模板中的起点和++修改一下。
卧槽,貌似我以前写的kmp模板都是错的,,,
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int Next[2000100]; int a[2000100],b[2000100],c[2000100]; void Getfail(int m) { int j, k; j = 0; k = -1; Next[0] = -1; while(j < m) if(k == -1 || b[j] == b[k]) Next[++j] = ++k; else k = Next[k]; } int KMP(int n,int m) { int i = 0,j = 0,ans = 0; while(i < n) { if(j == -1 || c[i] == b[j]) { i++,j++; if(j == m) { j = Next[j]; ans++; } } else j = Next[j]; } return ans; } int main() { int t,n,m,p; cin >> t; for(int ca = 1;ca <= t;ca++) { scanf("%d%d%d",&n,&m,&p); for(int i = 0;i < n;i++) scanf("%d",&a[i]); for(int i = 0;i < m;i++) scanf("%d",&b[i]); printf("Case #%d: ",ca); int sum = 0; Getfail(m); for(int i = 0;i < p;i++) { int num = 0; for(int j = i;j < n && i+(m-1)*p < n;j += p) c[num++] = a[j]; sum += KMP(num,m); } printf("%d\n",sum); } return 0; }
相关文章推荐
- HDU 5918 Sequence I【KMP?】【2016中国大学生程序设计竞赛(长春)】
- HDU 5918 Sequence I (KMP)
- hdu 5918 Sequence I (kmp)
- hdoj 5918 Sequence I(kmp, 暴力?)
- HDU 5918 Sequence I CCPC 长春 暴力求解
- hdu-5918 Sequence I(kmp)
- HDU - 5918 Sequence I 【kmp 变形】
- HDU-5918:Sequence I(KMP)
- HDU 5918 Sequence I KMP
- hdu 5918 暴力kmp
- 【hdu 5918】Sequence I(KMP)
- HDOJ 5918 Sequence I 【2016CCPC长春现场赛】KMP暴力
- HDU 5918 Sequence I【暴力+剪枝】(2016中国大学生程序设计竞赛(长春)H题)
- HDU1711 Number Sequence KMP基础
- HDU 5288 OO’s Sequence (暴力枚举因子)
- HDU 5273 Dylans loves sequence 暴力递推
- HDU 5918 KMP
- HDU--杭电--3415--Max Sum of Max-K-sub-sequence--暴力或单调队列
- hdu 5918(强行水过去..正解KMP)
- [HDU 5918] Sequence I (kmp)