hdu 1711 KMP演算法模板題
阿新 • • 發佈:2019-02-04
題意:給你兩個串,問你第二個串是從第一個串的什麼位置開始完全匹配的? 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; }