您的位置:首页 > 其它

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

2012-02-29 13:33 204 查看
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define MAX 1000005
//#define MAX 200

int 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相当于最上面的一行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐