Code:
# include <bits/stdc++.h>
using namespace std;
const int N = 1e2 + 10;
struct node{
string str;
int len;
}f[N][N][N];
string x, y, z;
int la, lb, lc;
int a[N], b[N], c[N];
int main(){
cin >> x >> y >> z;
la = x.size();
lb = y.size();
lc = z.size();
for(int i = 1; i <= la; i ++) a[i] = x[i - 1] - 'a';
for(int i = 1; i <= lb; i ++) b[i] = y[i - 1] - 'a';
for(int i = 1; i <= lc; i ++) c[i] = z[i - 1] - 'a';
for(int i = 1; i <= la; i ++){
for(int j = 1; j <= lb; j ++){
for(int k = 1; k <= lc; k ++){
if(a[i] == b[j] && c[k] == a[i]){
if(f[i][j][k].len < f[i - 1][j - 1][k - 1].len + 1){
f[i][j][k].len = f[i - 1][j - 1][k - 1].len + 1;
char ch = char(a[i] + 'a');
f[i][j][k].str = f[i - 1][j - 1][k - 1].str + ch;
}
}
else{
int max_val = 0;
if(f[i][j][k - 1].len < f[i][j - 1][k].len){
f[i][j][k].len = f[i][j - 1][k].len;
f[i][j][k].str = f[i][j - 1][k].str;
max_val = f[i][j - 1][k].len;
}
else{
f[i][j][k].len = f[i][j][k - 1].len;
f[i][j][k].str = f[i][j][k - 1].str;
max_val = f[i][j][k - 1].len;
}
if(max_val < f[i - 1][j][k].len){
f[i][j][k].len = f[i - 1][j][k].len;
f[i][j][k].str = f[i - 1][j][k].str;
}
}
}
}
}
cout << f[la][lb][lc].str;
return 0;
}