没啥可说的,裸地KMP。。
/********************** * author:crazy_石头 * Pro:HDOJ 1711 * algorithm: KMP * Judge Status:Accepted * Memory:4228K * Time:484ms * date:2013/11/01 ***********************/ #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> using namespace std; #define rep(i,h,n) for(int i=(h);i<=(n);i++) const int maxn=1000000+5; int next[maxn],s[maxn],p[maxn]; int n,m;//主串和模式串的串长; inline void getNext(int *p,int *next) { int i,j; next[0]=-1; i=0,j=-1; while(i<m)//m=strlen(p); { if(j==-1||p[i]==p[j])//匹配的情况下,p[j]==p[i] i++,j++,next[i]=j; else //不匹配的情况下,p[j]!=p[i] j=next[j]; } } inline int KMPMatch(int *s,int *p) { int i,j; i=0,j=0; getNext(p,next); while(i<n)//n=strlen(s); { if(j==-1||s[i]==p[j]) i++,j++; else j=next[j]; if(j==m) return i-m+1; } return -1; } int main() { int test; scanf("%d",&test); while(test--) { scanf("%d%d",&n,&m); rep(i,0,n-1) scanf("%d",&s[i]); rep(i,0,m-1) scanf("%d",&p[i]); int res=KMPMatch(s,p); printf("%d\n",res); } return 0; } |
* This source code was highlighted byYcdoiT. ( style: Fog )