KMP

来源:互联网 发布:linux 安装 jdk 编辑:程序博客网 时间:2024/06/05 09:53

从下标1开始。

inline void Calnxt ( char* s, int* nxt, int len )  {    register int i = 1, k = -1 ;    nxt [0] = -1 ;    while ( i <= len )  ( k == -1 || s [i] == s [k + 1] ) ? ( nxt [i ++] = ++ k ) : k = nxt [k] ;   }inline void Kmp ( char* a, char* b, int lena, int lenb, int* nxtb )  {    register int i ( 0 ), j ( -1 ) ;    while ( i <= lena )  {        if ( j == -1 || a [i] == b [j + 1] )  {            ++ i, ++ j ;            if( j == lenb )  {                printf ( "%d\n", i - j ) ;                j = nxtb [j] ;            }        }  else  j = nxtb [j] ;    }}

从下标0开始

void Calnxt ( char* s )  {    int len = strlen ( s ) ;    int i = 0, k = -1 ;    nxt [0] = -1 ;    while ( s [i] )  ( k == -1 || s [i] == s [k] ) ? nxt [++ i] = ++ k : k = nxt [k] ; }inline void Kmp ( char* a, char* b )  {    int lena ( strlen ( a ) ), lenb ( strlen ( b ) ) ;    int i = 0, j = 0 ;    while( i < lena )        if ( j == -1 || a [i] == b [j] )   {            ++ i, ++ j ;            if( j == lenb )                printf ( "Successed at %d\n", i - j ),                j = nxt [j] ;        }  else  j = nxt [j] ;}