首页 > 代码库 > HDU 5918 SequenceI (2016 CCPC长春站 KMP模版变形)
HDU 5918 SequenceI (2016 CCPC长春站 KMP模版变形)
这个题目的数据应该是比较弱的,赛场上的时候我们暴力也过了,而且我的kmp居然比暴力还要慢…… 这个变形并不难,跳着选数,把漏掉的位置补上就可以了。
代码如下:
#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;#define N 1000005int a[N],b[N],Next[N],n,m,q;void getNext(){ 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 start){ int ans = 0; int i,j = 0; for(i = start; i < n; i+=q) { while(j > 0 && a[i] != b[j]) j = Next[j]; if(a[i] == b[j]) j++; if(j == m) { ans++; j = Next[j]; } } return ans;}int main(){ int t,ans,ca=0; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&q); for(int i = 0; i < n; i++) { scanf("%d",&a[i]); } for(int i = 0; i < m; i++) { scanf("%d",&b[i]); } getNext(); ans = 0; if((m-1)*(q-1)+m <= n) { for(int i = 0; i < q; i++) { ans += kmp(i); } } printf("Case #%d: %d\n",++ca,ans); } return 0;}
HDU 5918 SequenceI (2016 CCPC长春站 KMP模版变形)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。