Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.21 KB | None | 0 0
  1. // LCS com Bit-paralelo
  2. //https://www.spoj.com/problems/LCS0/
  3. #include <stdio.h>
  4. #include <limits.h>
  5. #include <stdlib.h>
  6. #define INF INT_MAX
  7.  
  8. char A[50002], B[50002];
  9.  
  10. int main(){
  11.     scanf("%s\n%s",A,B);
  12.     register int i, j, k, m, n;
  13.     for ( m = 0; A[m]; ++m) ;
  14.     for ( n = 0; B[n]; ++n) ;
  15.     if ( m == 0 || n == 0) return 0;
  16.     char *X = A, *Y = B;
  17.     if (m < n) {
  18.         char *T;
  19.         T = X ; X = Y ; Y = T ;
  20.         k = m ; m = n ; n = k ;
  21.     }
  22.  
  23.     int w =( m + 31) >> 5; // ceil [m /32]
  24.  
  25.     unsigned int S [256][ w ]; // Sigma {all char }
  26.     for ( i = 0; i < 256; ++i)
  27.     for ( j = 0; j < w ; ++j)
  28.     S [ i ][ j ]=0;
  29.     unsigned int set = 1;
  30.     for ( i = 0 , j = 0; i < m ; ++i) {
  31.         S [ X [ i ]][ j ] |= set ;
  32.         set <<= 1;
  33.         if (!set) { ++set; ++j;}
  34.     }
  35.     unsigned int L[w]; // Vetor L(i)
  36.     unsigned int b1 , b2 , c ; // borrows and carries
  37.     for ( i = 0; i < w ; ++i) L[i] = 0;
  38.     register unsigned int U, V;
  39.     for ( i =0; i < n ; ++i) {
  40.         b1 = 1; b2 = 0;
  41.         for ( j = 0; j < w ; ++j) {
  42.             U = L[j] | S [ Y[i] ][j];
  43.             c = L[j] >> 31;
  44.             V = U - ( L[j] << 1 | b1 + b2 ) ;
  45.             b1 = c; b2 = ( V > U ) ;
  46.             L[j] = U & (~V) ;
  47.         }
  48.     }
  49.     for ( k = 0 , i = 0; i < w ; ++i)
  50.         for (; L [ i ]; ++k) L[i] &= L[i] - 1;
  51.     printf("%d\n", k);
  52.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement