[破碎的状态] [-9] Hdu 1711
又是一个kmp的模版题
求b数组在a中第一次出现的时间
直接上kmp
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<time.h> #include<math.h> #include<memory> #include<vector> #include<bitset> #include<fstream> #include<stdio.h> #include<utility> #include<sstream> #include<string.h> #include<iostream> #include<stdlib.h> #include<algorithm> using namespace std; int a[1000005],b[10005]; int fail[10005]; int main() { int t; scanf("%d",&t); int zu; for (zu=0;zu<t;zu++) { int n,m; scanf("%d%d",&n,&m); int i; for (i=0;i<n;i++) { scanf("%d",&a[i]); } for (i=0;i<m;i++) { scanf("%d",&b[i]); } fail[0]=-1; for (i=1;i<m;i++) { int t=fail[i-1]; for (;;) { if (t==-1) break; if (b[t+1]==b[i]) { break; } t=fail[t]; } if (b[t+1]==b[i]) { t++; } fail[i]=t; } int now=-1; for (i=0;i<n;i++) { for (;;) { if (now==-1) break; if (b[now+1]==a[i]) { break; } now=fail[now]; } if (b[now+1]==a[i]) { now++; } if (now==m-1) { printf("%d\n",i-m+2); break; } } if (i>=n) { printf("-1\n"); } } return 0; }