2 13 5 1 2 1 2 3 1 2 3 1 3 2 1 2 1 2 3 1 3 13 5 1 2 1 2 3 1 2 3 1 3 2 1 2 1 2 3 2 1
6 -1
题目链接: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]; else nextv[i]=j; } else j=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); //模式串 partern int ans=KMP(n,m); cout<<ans<<endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 1711 Number Sequence(KMP算法)
原文地址:http://blog.csdn.net/chaiwenjun000/article/details/47760493