Description
给定一个字符串text和pattern返回pattern在text中首次出现的位置。
Input
第一行用例个数,第二行text长度和pattern长度,第三行为text,第四行为pattern。
Sample Input
2
13 5
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 1 3
13 5
1 2 1 2 3 1 2 3 1 3 2 1 2
1 2 3 2 1
Sample Output
6
-1
Solution
看毛片算法首次出现位置板题。
#include <cstdio>
int a[1000010], b[10010];
int next[10010];
int n, m;
void getNext() //得到next数组
{
int j, k;
j = 0;
k = -1;
next[0] = -1; //第一位置置为-1
while (j < m)
{
if (k == -1 || b[j] == b[k])
next[++j] = ++k;
else
k = next[k];
}
}
//返回首次出现的位置
int KMP_Index()
{
int i = 0, j = 0;
getNext();
while (i < n && j < m)
{
if (j == -1 || a[i] == b[j])
{
i++;
j++;
}
else
j = next[j];
}
if (j == m)
return i - m + 1;
else
return -1;
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
scanf("%d", &a[i]);
for (int i = 0; i < m; i++)
scanf("%d", &b[i]);
printf("%d\n", KMP_Index());
}
return 0;
}