hpu 1897 CZY找句子

来源:互联网 发布:西门子840dsl编程手册 编辑:程序博客网 时间:2024/06/08 14:57

本题链接:点击打开链接

本题大意:

        输入一个N和一个M,第二行输入N个数值,第三行输入M个数值,M < N,求N中包含M的起始位置。

解题思路:

        使用KMP算法,求出next数组,然后进行比较,当首次出现子字符串时,输出主字符串的位置-子字符串的长度,因为从零开始编的号,故需加一。

参考代码:

#include<stdio.h>#include<string.h>int str1[1000100];int str2[1000100];int next[1000100];int n,m,len1,len2;void getnext(){int i=0,j=-1;next[i]=j;while(i<m){if(j==-1||str2[i]==str2[j]){i++;j++;next[i]=j;}elsej=next[j];}}int kmp(){int i=0,j=0;while(i<n){if(j==-1||str1[i]==str2[j]){i++;j++;if(j==m){return i-m+1; //输出位置编号从一开始,但从零开始编的号,故加一; }}elsej=next[j];}}int main(){while(scanf("%d%d",&n,&m)!=EOF){memset(next,0,sizeof(next));for(int i=0;i<n;i++)scanf("%d",&str1[i]);for(int j=0;j<m;j++)scanf("%d",&str2[j]);getnext();kmp();printf("%d\n",kmp());}return 0;}


 

0 0
原创粉丝点击