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: Runtime Error)

#include<cstdio>
bool v[3000][3000][3];
int l[3001][3001];
char s[3002],t[3002],u[3000];
int main(){
  scanf("%s%s",s+1,t+1);
  int sl=1,tl=1;
  while(s[sl]!='\0')sl++;
  while(t[tl]!='\0')tl++;
  for(int i=0;i<sl;i++){
    for(int j=0;j<tl;j++){
      for(int k=0;k<3;k++)v[i][j][k]=false;
      if(i==0||j==0)l[i][j]=0;
      if(s[i]==t[j]){
        v[i][j][0]=true;
        l[i][j]=l[i-1][j-1]+1;
      }else{
        if(l[i-1][j]<=l[i][j-1]){
          v[i][j][1]=true;
          l[i][j]=l[i][j-1];
        }
        if(l[i-1][j]>=l[i][j-1]){
          v[i][j][2]=true;
          l[i][j]=l[i-1][j];
        }
      }
    }
  }
  int ul=0,nowi=sl-1,nowj=tl-1;
  while(nowi>0&&nowj>0){
    if(v[nowi][nowj][0]){
      u[ul]=s[nowi];
      nowi--;
      nowj--;
      ul++;
    }else if(v[nowi][nowj][1])nowj--;
    else if(v[nowi][nowj][2])nowi--;
  }
  for(int i=ul-1;i>=0;i--)printf("%c",u[i]);
  return 0;
}