You are on page 1of 2

#include <bits/stdc++.

h>
using namespace std;

int dp[1001][1001];

int lcs(string a, string b, int n, int m){


for(int i=0 ; i<=n ; i++)
dp[i][0] = 0;
for(int i=0 ; i<=m ; i++)
dp[0][i] = 0;
//dp[][] before filling
// for(int i=0 ; i<=n ; i++){
// for(int j=0 ; j<=m ; j++){
// cout<<dp[i][j]<<" ";
// }
// cout<<endl;
// }
for(int i=1 ; i<=n ; i++){
for(int j=1 ; j<=m ; j++){
if(a[i-1]==b[j-1]){
dp[i][j] = dp[i-1][j-1]+1;
}
else{
dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
}
}
}
// dp[][] after filling
// for(int i=0 ; i<=n ; i++){
// for(int j=0 ; j<=m ; j++){
// cout<<dp[i][j]<<" ";
// }
// cout<<endl;
// }

string temp;
int i=n, j=m;
while(i > 0 || j > 0){
if(a[i-1] == b[j-1]){
temp.push_back(a[i-1]);
i--;
j--;
}
else if(dp[i-1][j] > dp[i][j-1]){
temp.push_back(a[i-1]);
i--;
}
else{
temp.push_back(b[j-1]);
j--;
}
}
if(j>=0){
while(j>0){
temp.push_back(b[j-1]);
j--;
}
}
if(i>=0){
while(i>0){
temp.push_back(a[i-1]);
i--;
}
}
reverse(temp.begin(), temp.end());
cout<<"scs: "<<temp<<endl;

return dp[n][m];
}

int lcsmemo(string a, string b, int n, int m){


if(n==0 || m==0)
return 0;
if(dp[n][m] != -1)
return dp[n][m];
else if(a[n-1] == b[m-1])
return dp[n][m] = 1+lcsmemo(a, b, n-1, m-1);
else
return dp[n][m] = max(lcsmemo(a, b, n-1, m), lcsmemo(a, b, n, m-1));
}

int main() {

int t;
cin>>t;
while(t--){
string a, b;
cin>>a>>b;

int n = a.size();
int m = b.size();

memset(dp, -1, sizeof(dp));


cout<<a<<" "<<b<<" "<<n+m-lcs(a, b, n, m)<<endl<<endl;
// memset(dp, -1, sizeof(dp));
// cout<<a<<" "<<b<<" "<<n+m-lcsmemo(a, b, n, m)<<endl<<endl;
}

return 0;
}

You might also like