hdu1711

来源:互联网 发布:java如何写接口 编辑:程序博客网 时间:2024/06/08 11:35

kmp最最最基础的水题。

先说下题意:给你两个序列a, b。问你a中是否存在b,若存在输出在a中b出现的首字母的位置(若有多个b,输出第一个b)。若不存在输出-1。

直接用kmp就秒A了。

#include<iostream>#include<cstring>#include<algorithm>#include<cstdio>#define INF 0x3f3f3f3f#define mmaxn 10000+10#define nmaxn 1000000+10using namespace std;int n, m;int y[nmaxn], x[mmaxn], nex[mmaxn];void get_nex(int *x, int m, int *nex){int i, j;j = nex[0] = -1;i = 0;while (i < m){while (j != -1 && x[i] != x[j]) j = nex[j];nex[++i] = ++j;}}int kmp_count(int *x, int m, int *y, int n){int i, j, ans;i = j = ans = 0;get_nex(x, m, nex);while (i < n){while (j != -1 && y[i] != x[j]) j = nex[j];++j;  ++i;if (j >= m) return i - m + 1;}return -1;}int main(){int cas;scanf("%d", &cas);while (cas--){scanf("%d %d", &n, &m);for (int i = 0;i < n;i++) scanf("%d", &y[i]);for (int i = 0;i < m;i++) scanf("%d", &x[i]);memset(nex, 0, sizeof(nex));int ans = kmp_count(x, m, y, n);printf("%d\n", ans);}return 0;}


0 0