Problem:
Score : 100 points

Problem Statement

You are given strings s and t.
Find one longest string that is a subsequence of both s and t.

Notes

A subsequence of a string x is the string obtained by removing zero or more characters from x and concatenating the remaining characters without changing the order.

Constraints

s and t are strings consisting of lowercase English letters.

1 \leq |s|, |t| \leq 3000

Input

Input is given from Standard Input in the following format:

s
t

Output

Print one longest string that is a subsequence of both s and t.
If there are multiple such strings, any of them will be accepted.

Sample Input 1

axyb
abyxb

Sample Output 1

axb

The answer is axb or ayb; either will be accepted.

Sample Input 2

aa
xayaz

Sample Output 2

aa

Sample Input 3

a
z

Sample Output 3

The answer is (an empty string).

Sample Input 4

abracadabra
avadakedavra

Sample Output 4

aaadara

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
int main(){
    
    string s1,s2;
    cin >> s1 >> s2;
    //cout << s1 <<endl<< s2 <<endl;
    int n = s1.size(), m= s2.size();
    vector < vector <int> > dp(s1.size(), vector <int>(s2.size()));
    for(int i =0;i<m;i++){
        if(i>0)dp[0][i]=dp[0][i-1];
        if(s1[0] == s2[i])dp[0][i]=1;

    }
    for(int i =1;i<n;i++){
        for(int j =0;j<m;j++){
                if(j==0){
                    if(s2[0]==s1[i])dp[i][0]=1;
                    else dp[i][0]=dp[i-1][0];
                    continue;
                }
            if(s2[j]==s1[i])dp[i][j] = dp[i-1][j-1]+1;
            else dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
        }
    }
//    for(int i =0;i<n;i++){
//        for(int j = 0;j<m;j++)cout << dp[i][j] << " ";
//    cout <<endl;
//    }
    int i =n-1,j=m-1;
    string s= "";
    while (i!=0 && j!=0){
        if(dp[i][j]!=dp[i-1][j] && dp[i][j]!=dp[i][j-1]){
            s+=s2[j];
            i--;j--;
        }else if( dp[i-1][j]<=dp[i][j-1]){
            j--;
        }else i--;
    }
    //cout << i <<  " " << j << endl;
    if(i==0){
        while(j>=0&&dp[0][j])j--;
        s+=s2[j+1];
    }else if(j==0 )s+=s2[0];
        reverse(s.begin(),s.end());
    cout << s << endl;
}