hdu1711-Number Sequence-kmp基础 模式匹配

kmp最基本功能,在主串找到子串位置并返回,找不到返回-1



#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
#include <set>
#include <vector>
#define  inf 0x7fffffff
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 1000005;
using namespace std;

int nextval[maxn];
void get_next(int *t,int len)	//失配函数

{
	int i,j;
	i=1; 
	nextval[1]=0;
	j=0;
	while(i<len)
	{
		
		if (j==0||t[i]==t[j])
		{ 
			j++;
			i++;  
			if (t[i]!=t[j])
			nextval[i]=j;
			else
				nextval[i]=nextval[j];
			
			
		}
		else
			j=nextval[j];
	}
	
}

int kmp(int* s,int* t,int len_s,int len_t)
{
	int i=1;
	int j=1;
	while(i<=len_s&&j<=len_t)
	{
		if (j==0||s[i]==t[j])
		{
			i++;j++;
		}
		else
			j=nextval[j];
	}
	if (j>len_t)
		return i-len_t;
	else
		return 0;
	
}


int tm[1000005];
int nm[10005];

int main( )
{
	
	int n;
	int cnt=1;
	int t;
	scanf("%d",&t);
	while(t--)
	{
		int i,n,m;
		scanf("%d%d",&n,&m);
		for (i=1;i<=n;i++)
		{
			scanf("%d",&tm[i]);
		}
		for (i=1;i<=m;i++)
		{
			scanf("%d",&nm[i]);
		}
		get_next(nm,m);
		int ans=kmp(tm,nm,n,m);
			printf("%d\n",ans>0?ans:-1);
		
	}
	
	
	
	
	return 0;
} 


你可能感兴趣的:(hdu1711-Number Sequence-kmp基础 模式匹配)