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);
}
}