hdu 1711(KMP)
2012-11-19 17:13
204 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1711
/*
最简单的 KMP
KMP算法的关键是 next[ ] 数组的确定, next[i] = j 表示当模式中的第 i 个字符与正文失去匹配时,可以直接让第 j 个字符与正文进行匹配;
*/
求前缀和后缀的最大匹配值时,要使用未优化的算法。
如果只是运用KMP进行模式匹配,可以使用下边的优化算法,避免了多余的判断,更加高效。
/*
最简单的 KMP
KMP算法的关键是 next[ ] 数组的确定, next[i] = j 表示当模式中的第 i 个字符与正文失去匹配时,可以直接让第 j 个字符与正文进行匹配;
*/
#include"iostream" using namespace std; #define N 1000005 #define M 10005 int s ,p[M],next[M]; void GetNext(int m) { int i,j; for(i=0,j=-1,next[0]=-1;i<m;){ if(j==-1||p[i]==p[j]){ i++; j++; next[i]=j; } else j=next[j]; } } int KMP(int n,int m) { int i,j; for(i=0,j=0;i<n&&j<m;){ if(j==-1||s[i]==p[j]){ i++; j++; } else j=next[j]; } if(j==m) return i-j+1; else return -1; } int main() { int T,n,m,i,j,ans; cin>>T; while(T--){ cin>>n>>m; for(i=0;i<n;i++) cin>>s[i]; for(j=0;j<m;j++) cin>>p[j]; GetNext(m); ans=KMP(n,m); cout<<ans<<endl; } return 0; }
求前缀和后缀的最大匹配值时,要使用未优化的算法。
如果只是运用KMP进行模式匹配,可以使用下边的优化算法,避免了多余的判断,更加高效。
void GetNext(int m) { int i,j; for(i=0,j=-1,next[0]=-1;i<m;){ if(j==-1||p[i]==p[j]){ i++; j++; if(p[i]!=p[j]) next[i]=j; else next[i]=next[j]; } else j=next[j]; } }
相关文章推荐
- 【 KMP 】HDU 1711
- hdu(Number Sequence 1711)kmp
- HDU - 1711 Number Sequence KMP
- KMP - HDU 1711 Number Sequence
- [HDU](1711)Number Sequence ---KMP(串)
- HDU:1711 Number Sequence(简单KMP)
- HDU 1711 KMP 初级
- hdu 1711 Number Sequence (KMP - 初步)
- HDU 1711 Number Sequence---KMP原始
- HDU 1711 裸KMP,附KMP模板
- HDU 1711 Number Sequence kmp
- hdu 1711(KMP入门题)
- HDU1711 Number Sequence (KMP 模板)
- HDU - 1711 Number Sequence(KMP)
- HDU 1711 Number Sequence (KMP)
- hdu--1711--kmp应用在整形数组--Number Sequence
- hdu 1711 kmp
- KMP入门题 HDU1686、hdu 1711、hdu 2203
- hdu 1711 kmp模板题
- hdu 1711 kuangbin 字符串 A KMP入门