题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711
Number Sequence
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 15548 Accepted Submission(s): 6836
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1711
看了视频也看了博客,对KMP算法算是有了一知半解,先来一发水题吧。
对于next 数组 只需要求模式串,也就是两个串匹配中较小的那个。
【源代码】
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn =1000005;
const int maxb =10005;
int a[maxn],b[maxb];
int nextv[maxb];
void get_next(int b[],int m){ //求模式串的 next数组int i=0;//前缀nextv[0]=-1;int j=-1;//后缀while(i<m){if(j==-1||b[i]==b[j]){i++; j++;if(b[i]==b[j]) //遇到相同元素的优化nextv[i]=nextv[j];elsenextv[i]=j;}elsej=nextv[j];}
}
int KMP(int n,int m){int i=0;int j=0;while(i<n&&j<m){if(j==-1||a[i]==b[j]){i++;j++;}else{j=nextv[j];}}if(j==m){ //只有匹配出结果j才能==m// cout<<"i: "<<i<<" "<<j<<endl;return i-m+1;}else return -1;
}
int main(){int T,n,m;scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int i=0;i<n;i++){scanf("%d",&a[i]);}for(int i=0;i<m;i++){scanf("%d",&b[i]);}get_next(b,m); //模式串 parternint ans=KMP(n,m);cout<<ans<<endl;}return 0;
}