hdu 5918

题意:两个串匹配,检测第二个串在第一个串中出现几次,不过,在第一个中步长是k,kmp模板,不过nm足以过了,为啥非要kmp,速度还慢

#include <bits/stdc++.h>
using namespace std;

const int N=1e6+5;
int a[N],b[N],f[N],vis[N];
int n,m,p,ans;
void sol(){
 for (int k=0;k<n;k++){
  int j=0;
  for (int i=k;i<n;i+=p){
   if (a[i]!=b[j]) break;
   else j++;
   if (j==m){ ans++;break;}
  }
 }
}
int main()
{
 int T;
 scanf("%d",&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);
  ans=0;sol();
  printf("Case #%d: %d\n",ca,ans);
 }
}
时间: 2024-10-04 19:49:49

hdu 5918的相关文章

HDU 5918 Sequence I KMP

Sequence I 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,?,bmis exactly the sequence aq,aq+p,aq+2p,?,aq+(m−1)p where q+(m−1)p≤n and q≥1. In

HDU 5918 SequenceI (2016 CCPC长春站 KMP模版变形)

这个题目的数据应该是比较弱的,赛场上的时候我们暴力也过了,而且我的kmp居然比暴力还要慢…… 这个变形并不难,跳着选数,把漏掉的位置补上就可以了. 代码如下: #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define N 1000005 int a[N],b[N],Ne

HDU 5918 KMP/模拟

Sequence I Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1013    Accepted Submission(s): 393 Problem Description Mr. Frog has two sequences a1,a2,?,an and b1,b2,?,bm and a number p. He wants t

HDU 5918 Sequence I (KMP)

Sequence I Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2330    Accepted Submission(s): 874 Problem Description Mr. Frog has two sequences a1,a2,?,an and b1,b2,?,bm and a number p. He wants t

【hdu 5918】Sequence I(KMP)

给定两个数字序列,求a序列中每隔p个构成的p+1个序列中共能匹配多少个b序列. 例如1 1 2 2 3 3 每隔1个的序列有两个1 2 3 kmp,匹配时每次主串往前p个,枚举1到p为起点. 题目 #include<bits/stdc++.h> #define N 1000005 int t,n,m,p; int nex[N]; int a[N],b[N]; using namespace std; void getNext(){ int i=0,k=-1; nex[0]=k; while(b

hdu 5918 Sequence I

给两个数组a , b,并给一个间隔值p.问在间隔值p下b在中有多少个匹配. 比如a数组为1 2 2 4 3,b数组为1 2 3,那么在间隔值为2的情况下有一个匹配. 把a数组中可以作为开头的所有间隔数字比如2可以开头的数字是1或者2,3可以开头的数字是1.2.3取出来. 然后做p次kmp即可. //#define test #include<bits/stdc++.h> using namespace std; const int Nmax=2e6+7; int f[Nmax]; int fl

Sequence I

Sequence I (hdu 5918) Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1938    Accepted Submission(s): 730 Problem Description Mr. Frog has two sequences a1,a2,?,an and b1,b2,?,bm and a number p

HDU 6203 ping ping ping [LCA,贪心,DFS序,BIT(树状数组)]

题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=6203] 题意 :给出一棵树,如果(a,b)路径上有坏点,那么(a,b)之间不联通,给出一些不联通的点对,然后判断最少有多少个坏点. 题解 :求每个点对的LCA,然后根据LCA的深度排序.从LCA最深的点对开始,如果a或者b点已经有点被标记了,那么continue,否者标记(a,b)LCA的子树每个顶点加1. #include<Bits/stdc++.h> using namespace std;

HDU 5542 The Battle of Chibi dp+树状数组

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 题意:给你n个数,求其中上升子序列长度为m的个数 可以考虑用dp[i][j]表示以a[i]结尾的长度为j的上升子序列有多少 裸的dp是o(n2m) 所以需要优化 我们可以发现dp的第3维是找比它小的数,那么就可以用树状数组来找 这样就可以降低复杂度 #include<iostream> #include<cstdio> #include<cstring> #include