您的位置:首页 > 产品设计 > UI/UE

HDU - 1711 Number Sequence(KMP)

2015-10-26 22:22 531 查看
题目大意:给你两个串,问第二个串是否在第一个串出现过,如果出现,输出最早出现的位置

解题思路:KMP裸题

#include <cstdio>
#include <cstring>
const int N = 1000010;
int a
, b
, next
;
int n, m;
void init() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);

for (int j = 1; j <= m; j++)
scanf("%d", &b[j]);
}

void getFail() {
next[1] = 0;
int i = 1, j = 0;
while (i <= m) {
if (j == 0 || b[i] == b[j]) {
j++; i++;
next[i] = j;
}
else j = next[j];
}
}

int solve() {
getFail();
int i = 1, j = 1;
while (i <= n) {
if (j == 0 || a[i] == b[j]) {
i++; j++;
if (j == m + 1) return i - m;
}
else j = next[j];
}
return -1;
}

int main() {
int test;
scanf("%d", &test);
while (test--) {
init();
printf("%d\n", solve());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: