day2——資料結構實驗之串三:KMP應用
資料結構實驗之串三:KMP應用
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
有n個小朋友,每個小朋友手裡有一些糖塊,現在這些小朋友排成一排,編號是由1到n。現在給出m個數,能不能唯一的確定一對值l和r(l <= r),使得這m個數剛好是第l個小朋友到第r個小朋友手裡的糖塊數?
Input
首先輸入一個整數n,代表有n個小朋友。下一行輸入n個數,分別代表每個小朋友手裡糖的數量。
之後再輸入一個整數m,代表下面有m個數。下一行輸入這m個數。
Output
如果能唯一的確定一對l,r的值,那麼輸出這兩個值,否則輸出-1
Sample Input
5 1 2 3 4 5 3 2 3 4
Sample Output
2 4
Hint
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int m, n, next[1000001], t[1000001], p[1000001]; //一開始陣列開小了一個0,結果WA
void setNext() //建立next陣列
{
int j, k;
j = 0;
k = -1;
next[0] = -1;
while(j < m)
{
if(k < 0 || p[j] == p[k])
{
k++;
j++;
next[j] = k;
}
else
{
k = next[k];
}
}
}
void kmp() //kmp演算法
{
int i = 0, j = 0, flag = 0, l, r;
while(i < n)
{
if(j < 0 || t[i] == p[j])
{
i++;
j++;
}
else
{
j = next[j];
}
if(j == m)
{
flag++;
if(flag >= 2) //如果能唯一的確定一對l,r的值,那麼輸出這兩個值,否則輸出-1
//唯一確定
{
break;
}
l = i - m + 1;
r = i;
}
}
if(flag == 1)
{
printf("%d %d\n", l, r);
}
else
{
printf("-1\n");
}
}
int main(void)
{
scanf("%d", &n);
int i;
for(i = 0; i < n; i++)
{
scanf("%d", &t[i]);
}
scanf("%d", &m);
for(i = 0; i < m; i++)
{
scanf("%d", &p[i]);
}
setNext();
kmp();
return 0;
}