����� �� �����.


������ ���������.

����� � �������, ��������, �������������������:
������ ����� ��������� � ������.


T����-��.

������� � ����������� - ������ �.

     ���� - �� �������� ���������� ��������� ������ - ����. �� ����� ���������� ������� ������, ������� ������� � ��������� ������� �� ����� ������� ������� ( � ������, ���� ��������� ����� �������� �������� ).

     �� ���� ��� ��� ������������:

     1. ����������� ����������� ����� ���� �������

     2. ����������� ���������� '����� - ������'

     ���� - ����� ����� ���������, ���� �� ���������, ��� ������� �������, ������� �������� � �������, ������, ��� ���, ������� ��� �������� �����.

     ���� u - ����������� �������, � v - c������, ��������� �� ����� ������� �������, ����� ��� uzv - ������� x. ����� av - ������� x, ��� ������� b ����������� �� ���������� p � ������, � ������� x ����� |uzv| ����� ������ ����� p, � ������ �� ����� ��������� ��� ��������� �������� b � ������. ���������� ��������� ����� ����� ����� |u| - |v| ( ��� �� � �������� ����� - ������� ).



���������� �����-������ � ������ |v| < |u|.


     �� |v| < |u|, ���� ����� ������� ������� ������, �� ����������� ����� ����� ������ ���� ����� |u| | 1. � ���� ������ ������� cd ��������, ��� ��� �� ������������, ��� ���������� ����� ��� ������� �������� ��������. ����� ����� �������, ��� �����-�����, �� ������� |u| + 1 ��������� cd � ����� � ��� �� �������� v. ������, ���� ����� ������� ������� ������, �� �� ����� ��������� ����� �������, ���� ������ |u| + 1.



������ ���������� ������� c =/= d � ����� � ��� �� �������� v.

���������� �� ��

/* In TBM function variable u memorizes the length of the suffix matched during
 the previous attempt and the variable v memorizes the length of the suffix
 during the current attempt
*/

/* Preprocessing of the Bad Character function shift */
PRE_BC( char *x, int m, int bm_bc[] ) {
   int a, j; 
   
   for ( a=0; a < ASIZE; a++ ) bm_bc[ a ] = m; 
   for ( j=0; j < m-1;  j++ ) bm_bc[ x[ j ] ] = m - j - 1; 
  }
 
 /* Preprocessing of the Good Suffix function shift  */
 PRE_GS( char *x, int m,  int bm_gs[] ) {
   int i, j, p, f[XSIZE];
   
   memset( bm_gs, 0, ( m + 1 ) * sizeof( int ) );
   f[ m ] = j = m + 1; 
   for (i=m; i > 0; i-- ) {
      while ( j <= m && x[ i - 1 ] != x[ j - 1 ] ) {
        if ( bm_gs[ j ] == 0 ) bm_gs[ j ] = j - 1;
       j = f[ j ];
     }
     f[ i - 1 ] = --j; 
   }
   p=f[ 0 ]; 
   for ( j=0; j <= m; ++j ) {
      if ( bm_gs[ j ] == 0 ) bm_gs[ j ] = p; 
     if ( j == p ) p = f[ p ]; 
   }
}

/* Boyer-Moore string matching algorithm */
void TBM( char *x, char *y, int n, int m ) {
  int i, j, u, shift, v, turbo_shift, bm_gs[XSIZE], bm_bc[ASIZE];
  
  /* Preprocessing */
  PRE_GS( x, m, bm_gs ); 
  PRE_BC( x, m, bm_bc );
  
  i = u = 0;
  shift = m;
  while ( i <= n-m ) {
     j = m - 1;
    while ( j >= 0 && x[ j ] == y[ i + j ] ) {
       --j;
      if ( u != 0 && j == m - 1 - shift ) j -= u;
   }
   if ( j < 0 ) {
      OUTPUT( i );
      shift = bm_gs[ 0 ];
      u = m - shift;
   }
   else {
      v = m - 1 - j;
      turbo_shift = u - v;
      bc_shift = bm_bc[ y[ i+j ] ] - m + j + 1;
      shift = MAX ( turbo_shift, bc_shift );
      shift = MAX ( shift, bm_gs[ j+1 ] );
      if ( shift == bm_gs[ j+1 ]) u = MIN( (m - shift), v );
      else {
         if ( turbo_shift < bc_shift ) shift = MAX (shift, (u+1) );
         u = 0;
      }
   }
   i += shift;
 }
}


����� � ������ ���������

����� �� ��������, � ������ ����������.
������



���������� �������� �������� ������ ����
�������� ������-���� �������� ��������
�������� �����-������ �������� �����-�������-������
�������� �������-������ �� ����� �� ������� ��������
�������� ������-���

SpyLOG