hdoj 1711(kmp算法)(数字不是字符串)

来源:互联网 发布:春光灿烂猪八戒知乎 编辑:程序博客网 时间:2024/06/07 06:07
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream>using namespace std;#define MAX 1000005//#define MAX 200int boss[MAX],pattern[MAX];int bossleng;int patternleng;//next表明的是字符串覆盖自己的性质也就是k值(也就是说next[j]=k)(j跟我写的文章中不太一样啊。)//我们要算next[6]的值,有关的为P本身前6个字符010010 。(这个就是例子)//此字符串中010 = 010左右相同的最大字符串为010,个数为3。所以next[i]=3;int next[MAX];int max(int a,int b){    if(a>b) return a;    return b;}void getnext(){ //初始化为0    memset(next,0,sizeof(next));    int i=-1,j=0;//i=-1的时候是为了下面的i++    next[0]=-1;//第一个肯定是-1    while(j<patternleng)    {           if(i==-1||pattern[i]==pattern[j])   {               i++;  j++;                 next[j]=i;           }           else i=next[i];    }} //获取的是开始匹配的位置//其实文章中跟论文中有一点出入//因为annb和anna比较的时候,后来移动的时候j=3,也就是从不匹配的那一位算的。int KMP(){    int i=0,j=0,len1=bossleng,len2=patternleng;//文章中所说的跳过,是没有比较的操作    while((i<len1)&&(j<len2))    {//j==-1表示没有一个相同的。i表示匹配到的字符串(母串),j表示的是开始比较是否匹配的字符串(模式串)        //当j==-1的时候需要i++,j++(),因为这个表示从第0个元素开始重新匹配。+1以后的值为0,才开始判断。//如果相同的话,也就是继续匹配下一个if(j==-1||boss[i]==pattern[j]) {j++;i++;}//如果不相同的话,移动。        else j=next[j];//取出next[j]    }//len2是模式串的长度,j是模式串的指针,也就是说如果说完全匹配,返回的是开始的位置    if(j==len2) return i-len2+1;//如果不匹配,返回-1    else return -1;}//获取的是匹配的长度int index_KMP(){    int i=0,j=0,len1=bossleng,len2=patternleng,re=0;    while(i<len1&&j<len2)    {if(j==-1||boss[i]==pattern[j]) {i++;j++;}        else j=next[j];re=max(re,j);    }    return re;}int main(){//freopen("in.txt","r",stdin);int casen;scanf("%d",&casen);while(casen--){scanf("%d %d",&bossleng,&patternleng);int i,j;for(i=0;i<bossleng;i++){scanf("%d",&boss[i]);}for(j=0;j<patternleng;j++){scanf("%d",&pattern[j]);}getnext();printf("%d\n",KMP());}    return 0;}//在那个表格当中i相当于最上面的一行。

原创粉丝点击