Shiam7777777

Untitled

May 19th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.79 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define fast ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  4. #define ll long long
  5. #define ld double
  6. #define llu long long unsigned
  7.  
  8. string A , B;
  9.  
  10. int dp[ (int)1e4 ][ (int)1e4 ];
  11. bool visited[ (int)1e4 ][ (int)1e4 ];
  12.  
  13. int calcLCS( int  i , int j )
  14. {
  15.  
  16.     if( A[ i ] == '\0' or B[ j ] == '\0' )
  17.         return 0;
  18.  
  19.     if( visited[ i ][ j ] )
  20.         return dp[ i ][ j ];
  21.  
  22.     int ans = 0;
  23.  
  24.     if( A[ i ] == B[ j ] )
  25.         ans = 1 + calcLCS( i + 1 , j + 1 );
  26.  
  27.     else
  28.         ans = max( calcLCS( i + 1 , j ) , calcLCS( i , j + 1 ) );
  29.  
  30.     visited[ i ][ j ] = 1;
  31.     dp[ i ][ j ] = ans;
  32.  
  33.     return ans;
  34.  
  35. }
  36.  
  37. string ansString = "";
  38.  
  39. void printLCS( int i , int j )
  40. {
  41.  
  42.     if( A[i] == '\0' or B[j] == '\0' )
  43.     {
  44.          cout<<ansString<<endl;
  45.          return;
  46.     }
  47.  
  48.     if( A[i] == B[j] )
  49.     {
  50.         ansString += A[i];
  51.         printLCS( i + 1 , j + 1 );
  52.     }
  53.  
  54.     else if( dp[i+1][j] > dp[i][j+1] )
  55.         printLCS( i + 1 , j );
  56.  
  57.     else
  58.         printLCS( i , j + 1 );
  59.  
  60. }
  61.  
  62. string ansAllString = "";
  63.  
  64. void printAllLCS( int i , int j )
  65. {
  66.  
  67.     if( A[i] == '\0' or B[j] == '\0' )
  68.     {
  69.          cout<<ansAllString<<endl;
  70.          return;
  71.     }
  72.  
  73.     if( A[i] == B[j] )
  74.     {
  75.         ansAllString += A[i];
  76.         printAllLCS( i + 1 , j + 1 );
  77.         ansAllString.erase( ansAllString.size() - 1 , 1 );
  78.     }
  79.  
  80.     else if( dp[i+1][j] > dp[i][j+1] )
  81.         printAllLCS( i + 1 , j );
  82.  
  83.     else if( dp[i+1][j] < dp[i][j+1] )
  84.         printAllLCS( i , j + 1 );
  85.  
  86.     else
  87.         printAllLCS( i + 1 , j ) , printAllLCS( i , j + 1 );
  88.  
  89. }
  90.  
  91. int main()
  92. {
  93.     fast;
  94.  
  95.     cin>>A>>B;
  96.     cout<<calcLCS( 0 , 0 )<<endl;
  97.     printLCS( 0 , 0 );
  98.     printAllLCS( 0 , 0 );
  99.  
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment