Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define fast ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
- #define ll long long
- #define ld double
- #define llu long long unsigned
- string A , B;
- int dp[ (int)1e4 ][ (int)1e4 ];
- bool visited[ (int)1e4 ][ (int)1e4 ];
- int calcLCS( int i , int j )
- {
- if( A[ i ] == '\0' or B[ j ] == '\0' )
- return 0;
- if( visited[ i ][ j ] )
- return dp[ i ][ j ];
- int ans = 0;
- if( A[ i ] == B[ j ] )
- ans = 1 + calcLCS( i + 1 , j + 1 );
- else
- ans = max( calcLCS( i + 1 , j ) , calcLCS( i , j + 1 ) );
- visited[ i ][ j ] = 1;
- dp[ i ][ j ] = ans;
- return ans;
- }
- string ansString = "";
- void printLCS( int i , int j )
- {
- if( A[i] == '\0' or B[j] == '\0' )
- {
- cout<<ansString<<endl;
- return;
- }
- if( A[i] == B[j] )
- {
- ansString += A[i];
- printLCS( i + 1 , j + 1 );
- }
- else if( dp[i+1][j] > dp[i][j+1] )
- printLCS( i + 1 , j );
- else
- printLCS( i , j + 1 );
- }
- string ansAllString = "";
- void printAllLCS( int i , int j )
- {
- if( A[i] == '\0' or B[j] == '\0' )
- {
- cout<<ansAllString<<endl;
- return;
- }
- if( A[i] == B[j] )
- {
- ansAllString += A[i];
- printAllLCS( i + 1 , j + 1 );
- ansAllString.erase( ansAllString.size() - 1 , 1 );
- }
- else if( dp[i+1][j] > dp[i][j+1] )
- printAllLCS( i + 1 , j );
- else if( dp[i+1][j] < dp[i][j+1] )
- printAllLCS( i , j + 1 );
- else
- printAllLCS( i + 1 , j ) , printAllLCS( i , j + 1 );
- }
- int main()
- {
- fast;
- cin>>A>>B;
- cout<<calcLCS( 0 , 0 )<<endl;
- printLCS( 0 , 0 );
- printAllLCS( 0 , 0 );
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment