HDU-1711-Number Sequence

题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1711

 

 

 

KMP

#include<iostream>
#include<string>
using namespace std;
const int Max_n=1000010;
const int Max_m=10010;
int a[Max_n];
int b[Max_m];
int n, m;

//void get_nextval(const char *T, int next[]) //字符数组用这个
void get_nextval(const int *T, int next[]) 
{ 
	// 求模式串T的next函数值(第二种表示方法)并存入数组 next。 
	int j = 1, k = 0; 
	next[0] = 0; 
	//while ( T[j] != '\0' )//字符数组用这个
	while(j<m)
	{	
		if(T[j] == T[k]) 
		{ 
			next[j] = k; 
			++j; ++k; 
		} 
		else if(T[j] != T[0]) 
		{ 
			next[j] = k; 
			++j; 
			k=0; 
		} 
		else 
		{ 
			next[j] = k; 
			++j; 
			k=1; 
		} 
	}//while 

/*for(int i=0;i<j;i++) 
{ 
cout<<next[i]; 
} 
cout<<endl; */
}// myget_nextval 


//void getNext(const char* pattern,int next[])    //字符数组的用这个
void getNext(const int* pattern,int next[]) 
{ 
	next[0]= -1; 
	int k=-1,j=0; 
	//while(pattern[j] != '\0')   //字符数组的用这个
	while(j<m)  //int数组的用这个
	{ 
		if(k!= -1 && pattern[k]!= pattern[j] ) 
			k=next[k]; 
		++j;++k; 
		if(pattern[k]== pattern[j]) 
			next[j]=next[k]; 
		else 
			next[j]=k; 
	} 
/*////这里是我加的显示部分
for(int i=0;i<j;i++)
	{
		cout<<next[i];
	}
	cout<<endl;
	*/
} 

int Index_BF(int S[], int T[], int pos)
{
	/* 若串 S 中从第pos(S 的下标0≤pos<StrLength(S))个字符
	起存在和串 T 相同的子串,则称匹配成功,返回第一个
	这样的子串在串 S 中的下标,否则返回 -1 */
	int i=pos, j=0;
	while(i<n && j<m)
	{
		if(S[i+j]==T[j])
			j++;//继续比较后一个字符	
		else
		{//重新开始新的一轮匹配
			i++;
			j=0;
		}
	}
	if(j==m)
		return i;//匹配成功,返回下标	
	else
		return -1;// 串S中(第pos个字符起)不存在和串T相同的子串
}//Index_BF

//int KMP(const char* Text, const char* Pattern) //字符数组的用这个
int KMP(const int *Text, const int *Pattern)
{
	/*if( !Text||!Pattern|| Pattern[0]=='\0' || Text[0]=='\0' )// 
		return -1;//空指针或空串,返回-1。

	int len=0;
	const char * c=Pattern; 
	while(*c++!='\0')//移动指针比移动下标快。
	{	
		++len;//字符串长度。
	} 
	*/
	int *next=new int[m+1];
	getNext(Pattern, next);
	int index=0, i=0, j=0;
	//while(Text[i]!='\0' && Pattern[j]!='\0')
	while(i<n && j<m)
	{
		if(Text[i]==Pattern[j])
		{
			i++;
			j++;
		}
		else
		{
			index+=j-next[j];
			if(next[j]!=-1)
				j=next[j];
			else
			{
				j=0;
				i++;
			}
		}
	}
	delete[]next;
	if(j==m)
		return index;
	else
		return -1;
}

int main()
{
	int next[100];
	//getNext(cc, next);
	//cout<<endl;
	//myget_nextval(cc,next);

	
	int t;
	int k;
	cin>>t;
	while(t--)
	{
		int i;
		cin>>n>>m;
		for(i=0; i<n; i++)
			scanf("%d", &a[i]);
		for(i=0; i<m; i++)
			scanf("%d", &b[i]);
		//k=Index_BF(a, b, 0);
		k=KMP(a, b);
		if(k!=-1)
			cout<<k+1<<endl;
		else
			cout<<-1<<endl;
	}
	return 0;
}

 

 

 

 

posted @ 2013-01-19 14:06  另Ⅰ中Feel▂  阅读(139)  评论(0编辑  收藏  举报