给两串数字,问第一串数字在第二串中出现的最早位置
*解法:kmp……
然后,next 在不知道哪个库函数里是关键字,所以数组名就不要叫next啦去掉元音字母,贡献了一发CE
KMP嘛,就是字符串匹配,匹配失败时不再从头进行匹配 而是利用next来减少重复判断匹配的时间
#include <iostream> #include <cstdio> using namespace std; #define SZ 10005 #define MAXN 1000005 int nxt[SZ]; int a[MAXN], b[SZ]; int n, m; void get_next(int p[]) { int i = 0, j = -1; nxt[0] = -1; while(i < m - 1) { if(j == -1 || p[i] == p[j]) { i++; j++; nxt[i] = j; } else j = nxt[j]; } return; } int kmp(int p[], int s[]) { int i = 0, j = 0; while(i < n && j < m) { if(j == -1 || s[i] == p[j]) { i++; j++; } else j = nxt[j]; } if(j == m) return i - j + 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]); get_next(b); int ans = kmp(b, a); printf("%d\\n", ans); } return 0; }
KMP的理解:https://www.cnblogs.com/zhangtianq/p/5839909.html