#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
#include <algorithm>
#include <climits>
#include <set>
#include <map>
#include <queue>
#include <deque>
#include <stack>
#include <string>
#include <list>
#include <ctime>
#include <complex>
#include <bitset>
#include <tuple>
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define all(x) x.begin(), x.end()
#define ff first
#define ss second
#define MOD 1000000007LL
#define rep(i,a,n) for (int i=a ; i<n ; i++)
#define per(i,a,n) for (int i=n-1 ; i>=a ; i--)
#define LLINF (llong)1e18+5
#define INF 1e9+5
using namespace std;
using llong = long long;
using VI = vector<int>;
using VLL = vector<long long>;
using PII = pair<int, int>;
string s1, s2;
vector<vector<int>> dp; // dp[i][j] = s1의 i번째 index, s2의 j번째 index로부터 만들 수 있는 longest
int dfs(int index1, int index2)
{
if (index1 == s1.length() || index2 == s2.length()) return 0;
if (dp[index1][index2] != -1) return dp[index1][index2];
if (s1[index1] == s2[index2]) return dp[index1][index2] = dfs(index1 + 1, index2 + 1) + 1;
else return dp[index1][index2] = max(dfs(index1 + 1, index2), dfs(index1, index2 + 1));
}
int main()
{
IOS;
cin >> s1 >> s2;
dp.resize(s1.length()+1);
rep(i, 0, s1.length()+1) dp[i].resize(s2.length()+1), fill(all(dp[i]), -1);
int ans = dfs(0, 0);
int startY = 0, startX = 0;
rep(i, 0, dp.size())
{
rep(j, 0, dp[i].size())
{
cout.width(3);
cout << dp[i][j] << " ";
}
cout << endl;
}
cout << ans << endl;
if(ans > 0)
while (1)
{
while (1)
if (dp[startY + 1][startX + 1] == ans)
{
startY++; startX++;
}
else break;
while (1)
if (dp[startY + 1][startX] == ans) startY++;
else break;
while (1)
if (dp[startY][startX + 1] == ans) startX++;
else break;
//cout << startY << " " << startX << endl;
cout << s1[startY];
ans--;
if (ans <= 0) break;
}
return 0;
}
니네도 종만북사라 dp실력 개늘었다
프갤 상위 1%