/******************************************************* Problem - Subsequences Solution by: Sean Falconer Algorithm: This is just a simple extension to the common dynamic programming solution to LCS for two strings. *******************************************************/ #include #include using namespace std; int A[51][51][51]; int B[51][51][51]; string s1, s2, s3; // print the LCS void print(int i, int j, int k) { if(i == 0 || j == 0 || k == 0) return; if(B[i][j][k] == 1) { print(i-1, j-1, k-1); cout << s1[i-1]; } else if(B[i][j][k] == 2) { print(i-1, j, k); } else if(B[i][j][k] == 3) { print(i, j-1, k); } else { print(i, j, k-1); } } // compute the LCS void lcs(string & s1, string & s2, string & s3) { for(int i = 0; i < 51; i++) { A[i][0][0] = 0; A[0][i][0] = 0; A[0][0][i] = 0; } for(int i = 1; i <= s1.length(); i++) { for(int j = 1; j <= s2.length(); j++) { for(int k = 1; k <= s3.length(); k++) { if(s1[i-1] == s2[j-1] && s1[i-1] == s3[k-1]) { A[i][j][k] = A[i-1][j-1][k-1] + 1; B[i][j][k] = 1; } else { if(A[i-1][j][k] > A[i][j-1][k]) { A[i][j][k] = A[i-1][j][k]; B[i][j][k] = 2; } else { A[i][j][k] = A[i][j-1][k]; B[i][j][k] = 3; } if(A[i][j][k-1] > A[i][j][k]) { A[i][j][k] = A[i][j][k-1]; B[i][j][k] = 4; } } } } } cout << A[s1.length()][s2.length()][s3.length()] << " "; print(s1.length(), s2.length(), s3.length()); cout << endl; } int main() { int T; cin >> T; for(int i = 0; i < T; i++) { cin >> s1 >> s2 >> s3; lcs(s1, s2, s3); } return 0; }