#include <stdio.h>
#include <cstring>
#include <iostream>
#include <algorithm>
#define max(a,b)a>b?a:b
using namespace std;
int dp[100][100];
int vis[100][100];
int LCS(char* str1, char* str2) {
int len1 = strlen(str1);
int len2 = strlen(str2);
for (int i = 0; i <= len1; i++) dp[i][0] = 0;
for (int j = 0; j <= len2; j++) dp[0][j] = 0;
for (int i = 1; i <= len1; i++) {
for (int j = 1; j <= len2; j++) {
if (str1[i-1] == str2[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
vis[i][j] = 1;
} else {
if (dp[i-1][j] > dp[i][j-1]) {
dp[i][j] = dp[i-1][j];
vis[i][j] = 2;
} else {
dp[i][j] = dp[i][j-1];
vis[i][j] = 3;
}
}
}
}
return dp[len1][len2];
}
void show(char* r, char* s) {
printf(" ");
for (int i = 0; i < strlen(s); i++) printf("%c ", s[i]);
printf("\n");
int k = 0;
for (int i = 0; i <= strlen(r); i++) {
if (i >= 1) printf("%c ", r[k++]);
else printf(" ");
for (int j = 0; j <= strlen(s); j++){
printf("%d ", dp[i][j]);
}
printf("\n");
}
printf("\n");
}
void getResult(int i, int j, char* r) {
if (i == 0 || j == 0) return;
if (vis[i][j] == 1) {
getResult(i-1, j-1, r);
printf("%c", r[i-1]);
} else if (vis[i][j] == 2) {
getResult(i-1, j, r);
} else {
getResult(i, j-1, r);
}
}
int main() {
char p[] = {"asdfghj"};
char s[] = {"asdlkdfgh"};
int ans = LCS(p, s);
printf("%d\n", ans);
show(p, s);
getResult(strlen(p), strlen(s), p);
return 0;
}