hdu 1711 Number Sequence

来源:互联网 发布:怎么看淘宝店网址 编辑:程序博客网 时间:2024/05/29 06:53

最基本的kmp算法的应用 

这里贴一个我个人认为kmp算法讲的不错的博客点击打开链接

不过上面并没有给出代码模板 ,这里本题目的代码就可以当做模板 ,kmp算法主要有两个函数组成,一个是求next数组,另一个便求匹配的字符串了, 求next数组采用了递归的思想,具体实现见代码。

这里我选择了一份比较简洁的模板。

有几点需要注意,这里的next数组下标是从1开始的,0位置是-1,而串的坐标均是从0开始的,也就是说,相同的位置next数组对应的下标要比a,b数组大1,这里与k=next[k]这一等式有关,不明白的话,可以自己在纸上演示一下。

#include <cstdio>#include <cstring>using namespace std;int n,m;int a[1000005],b[10005],next[10005];int get(){int j,k;j=0;k=-1;next[0]=-1;while(j<m){if(k==-1||b[j]==b[k])next[++j]=++k;elsek=next[k];}return 1;}int kmp(){get();int j=0,k=0;while(j<n&&k<m){if(a[j]==b[k]||k==-1)        {            j++;            k++;        }else{k=next[k];}}if(k==m)return j-m+1;elsereturn -1;}int main(){   // freopen("in.txt","r",stdin);int t;scanf("%d",&t);while(t--){memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(next,0,sizeof(next));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]);int ans=kmp();printf("%d\n",ans);}}


0 0
原创粉丝点击