hdu 1711 KMP算法模板题
题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m)。
当一个字符串以0为起始下标时。next[i]能够描写叙述为"不为自身的最大首尾反复子串长度"。
当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 而且next[j]恰好等于这个最大长度。
防止超时。注意一些细节。。
另外:尽量少用strlen。变量记录下来使用比較好,用字符数组而不用string
//KMP算法模板题 //hdu 1711 #include<iostream> #include<string.h> using namespace std; int a[1000010]; int b[10010]; int next1[10010]; void getnext(int len)//參数是子串的长度 { int i=0,j=-1; next1[0]=-1; while(i<len) { if(j==-1||b[i]==b[j]) { i++; j++; next1[i]=j; } else j=next1[j]; } } int KMP(int n,int m)//參数是原始串和子串的长度 { int i=0,j=0;//注意是0 while(i<n&&j<m) { if(j==-1||a[i]==b[j]) { i++; j++; } else j=next1[j]; } if(j==m)//已经找到,注意假设下表为1,改为i-j+1; return i-j; else return -1; } int main() { int T; int n,m; cin>>T; while(T--) { cin>>n>>m; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<m;i++) cin>>b[i]; getnext(m); int ans=KMP(n,m); cout<<ans<<endl; } return 0; }