HDU1711 KMP的应用
这个题的意思就是给你一个串, 让你求这个串在另外一个串里第一次出现的位置, 代码如下:
#include <cstdio> #include <cstring> using namespace std; int N, M; int a[1000000+100], b[10000+100]; int next[10000+10]; void getnext(){ int i=0, j=-1; next[0] = -1; while(i<M){ if(j==-1 || b[i]==b[j]) { i++; j++; next[i] = b[i]==b[j]?next[j]:j; } else j = next[j]; } } int KMP(){ int i=0, j=0; while(i<N){ if(j==-1 || a[i]==b[j]) i++, j++; else j = next[j]; if(j==M) return i-M+1; } 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]); getnext(); printf("%d\n", KMP()); } return 0; }