hpuoj1697 CZY找句子【KMP】

1697: CZY找句子

時間限制: 1 Sec  內存限制: 128 MB
提交: 99  解決: 45
[提交][狀態][討論版]

題目描述

YY喜歡讀書,而且總是喜歡從書上摘取好的句子或詞語,但是抄完之後她變忘了在哪,於是她就請CZY幫她,CZY感覺這我多我可咋找啊!
於是又來麻煩聰明的你,爲了方便CZY早已用高端譯碼機器把句子變成的數字,他想讓你告訴他句子在文章中出現的位置。(位置從1開始)

輸入

輸入包括多組測試數據,每組測試數據包含三行,第一行包含兩個整數n(1<=n<=1000000),m(1<=m<=1000),分別代表文章的長度,和所摘取的句子的長度,
第二行包含n個整數表示文章,第三行包括m各整數表示句子

輸出

輸出所摘取的句子在文章中的位置

樣例輸入

13 5
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 1 3

樣例輸出

6
#include<stdio.h>
#include<string.h>
const int maxn = 1010;
int p[maxn];
int b[maxn],a[maxn*1000];
int n,m,ans;
void getp()
{
	int i=0,j=-1;
	p[i]=j;
	while(i<m)
	{
		if(j==-1||b[i]==b[j])
		{
			i++,j++;
			p[i]=j;
		}
		else j=p[j];
	}
}
void kmp()
{
	getp();
	int i=0,j=0;
	while(i<n)
	{
		if(j==-1||a[i]==b[j])
		{
			i++;
			j++;
		}
		else j=p[j];
		if(j==m)
		   ans=i+1-m;
	}
}
int main()
{
	int i,j;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
	    for(i=0;i<n;i++)
	       scanf("%d",&a[i]);
	    for(j=0;j<m;j++)
	       scanf("%d",&b[j]);
	    kmp();
	    printf("%d\n",ans);
	}
}

發佈了82 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章