http://acm.hdu.edu.cn/showproblem.php?pid=1711
终于炼化了kmp算法,就算是现在我仍然惊异于字符串匹配居然存在线性时间的算法这种超出了我这种sb认知的东西。
自己搞了N久,发现还是没有网上的模板写的好,这里直接收藏了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <queue> using namespace std ; int n,m; int a[1000002],b[10002]; int _next[1000002]; void Init_() { int i,k; i = 0; k = -1; _next[0] = -1; while(i < m){ if(k == -1 || b[i] == b[k]){ i++;k++; if(b[i] != b[k]) _next[i] = k; else _next[i] = _next[k]; } else k = _next[k]; } } int kmp() { int i,j; i = 0;j = 0; while(i < n && j < m){ 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]); Init_(); printf("%d\n",kmp()); } return 0; }