题意:给你两个序列,一个文本串一个匹配串,但是匹配的模式不是一个一个的匹配,而是隔p个匹配一次问你最大的匹配数量
思路:构建nex数组都一样,我们把他拆成p个串就好了,之后跑一边kmp就可以出答案了
代码:
#include <string.h> #include <stdio.h> #include <algorithm> #include <iostream> using namespace std; #define mod 10007 const int maxn = 1e6+10; int nex[maxn],dp[maxn],p; int n,m; int a[maxn],b[maxn]; void pre_kmp() { memset(nex,0,sizeof(nex)); int k = -1 , i = 0; nex[0] = -1; while(i<m) { if(k == -1 || b[i] == b[k]) { i++ ,k++; nex[i] = k; } else k = nex[k]; } } int kmp() { int ans = 0; int k = 0 , i = 0 ; for(int j = 0 ;j < p ; j++)//这里没有拆串而且跑了p遍 kmp都一样 { k = 0; i = j; while(i<n) { if(k == -1 || a[i] == b[k]) i = i + p , k++; else k = nex[k]; if(k == m) { ans++,k = nex[k]; } } } return ans; } int main() { int t; scanf("%d",&t); for(int i = 1 ;i <= t ; i ++) { 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]); } pre_kmp(); kmp(); printf("Case #%d: %d\n",i,kmp()); } } /* 4 6 3 1 1 2 3 1 2 3 1 2 3 6 3 2 1 3 2 2 3 1 1 2 3 */