Go: package main

import (
	"bufio"
	"os"
	"fmt"
	"strconv"
)

const max int = 1000 + 1
var A [][]int

func lcs(x, y string) int {
	x = " " + x
	y = " " + y
	for i:=0;i<len(x); i++ {
		for j:=0;j<len(y); j++ {
			A[i][j] = 0
		}
	}
	for i:=1; i<len(x); i++ {
		for j:=1; j<len(y); j++ {
			if x[i] == y[j] {
				A[i][j] = A[i-1][j-1] + 1
			} else if A[i-1][j] > A[i][j-1] {
				A[i][j] = A[i-1][j]
			} else {
				A[i][j] = A[i][j-1]
			}
		}
	}
	return A[len(x)-1][len(y)-1]
}

func nextInt(scanner *bufio.Scanner) int {
	scanner.Scan()
	num, _ := strconv.Atoi(scanner.Text())
	return num 
}

func nextStr(scanner *bufio.Scanner) string {
	scanner.Scan()
	return scanner.Text()
}


func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)
	A = make([][]int, max)
	for i := range A {
		A[i] = make([]int, max)
	}
	n := nextInt(scanner)
	for i:=0; i<n; i++ {
		x := nextStr(scanner)
		y := nextStr(scanner)
		fmt.Printf("%d\n", lcs(x, y))
	}
}

C++: #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <bitset>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <string>
#include <sstream>
#include <algorithm>
#include <iomanip>
#include <iostream>

#define VARIABLE(x) cerr << #x << "=" << x << endl
#define BINARY(x) static_cast<bitset<16> >(x);
#define if_range(x, w, h) if (w <= x && x <= h)
#define BitCheck(a,b)   (a >> b) & 1
#define BitSet(a,b)       a |= (1 << b)
#define BitunSet(a,b)    a &= ~(1 << b)

int compare_int(const void* a, const void* b) { return *(int*) a - *(int*) b; }

int main() {
	int n, m, a, dp[102][102] = { 0 };
	char s[1001], t[1001];
	scanf("%d", &a);
	for (int k = 0; a > k; k++) {
		scanf("%d %d %s %s", &n, &m, s, t);
		for (int i = 1; n >= i; i++) {
			for (int j = 1; m >= j; j++) {
				if (s[i - 1] == t[j - 1])dp[i][j] = dp[i - 1][j - 1] + 1;
				else dp[i][j] = __max(dp[i - 1][j], dp[i][j - 1]);
			}
		}
		printf("%d\n", dp[n][m]);
	}
	return 0;
}

C++: #include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <string>
#include <functional>
#include <numeric>
#include <ctype.h>
#include <cstdlib>
#include <string.h>
#include <cmath>
#include <cstdio>
#include <map>
#include <queue>
#include <utility>
#define rep(i, n) for(int i = 0; i < n; i++);

using namespace std;

const int INF = 1000000007;
const double PI = acos(-1.0);
typedef long long llong;

const int N = 10000;

int search(string X, string Y)
{
	int c[1000 + 1][1000 + 1];
	int m = X.size();
	int n = Y.size();
	int maxl = 0;
	X = " " + X;
	Y = " " + Y;


	for (int i = 1; i <= m; i++) 
		c[i][0] = 0;
	for (int j = 1; j <= n; j++)
		c[0][j] = 0;

	for (int i = 1; i <= m; i++)
	{
		for (int j = 1; j <= n; j++)
		{
			if (X[i] == Y[j])
				c[i][j] = c[i - 1][j - 1] + 1;
			else
				c[i][j] = max(c[i - 1][j], c[i][j - 1]);

			maxl = max(maxl, c[i][j]);
		}
	}

	return maxl;
}



int main()
{
	string input1, input2;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> input1 >> input2;
		cout << search(input1, input2) << endl;
	}

	return 0;
	

}

C++: #include<iostream>
#include<algorithm>
#include<string>
using namespace std;

string X;
string Y;

int calc(int x_s, int x, int y, int length){
    if (X[x] == '\0') return length;
    int y_ = Y.find(X[x], y);
    if (y_ == string::npos) {
        return max(length, calc(x_s + 1, x_s + 1, 0, 0));
    }
    return calc(x_s, x + 1, y_ + 1, length + 1);
}

int main(){
    int q;
    cin >> q;
    for (int i = 0; i < q; i++) {
        cin >> X;
        cin >> Y;
        cout << calc(0, 0, 0, 0) << endl;
    }

    return 0;
}

C++: #include <stdio.h>
#include <string.h>

int main(){
   char str_s[128], str_p[128];
   int a[100]=0;
   int i, j, c, h, n, m;
   scanf("%d",n);
   for(i=0;i < n;i++){
      scanf("%s",str_s);
      scanf("%s",str_p);
      n=strlen(str_s);
      m=strlen(str_p);
      c=0;
      h=0;
      for(i=0;i < n;i++){
         for(j=h;j < m;j++){
            if(str_s[i] ==str_p[j]){
               h=j+1;
               c++;
               break;
            }
         }
      }
      printf("%d\n, c");
   }

   return 0;
}

C++: #include<iostream>
#include<string>
using namespace std;

int main(){
  int i,j,n,c[1001][1001];
  string x,y;
  cin >> n;
  while(n>0){
    n--;
    cin >> x;
    cin >> y;

    int lenx = x.size();
    int leny = y.size();

    for(i = 1; i < lenx; i++){
      c[i][0] = 0;
    }
    for(j = 1; j < leny; j++){
      c[0][j] = 0;
    }
  
    for(i = 0; i < lenx; i++){
      for(j = 0; j < leny; j++){
	if(x[i]==y[j]){
	  c[i][j] = c[i-1][j-1] + 1;
	}else if(c[i-1][j] >= c[i][j-1]){
	  c[i][j] = c[i-1][j];
	}else{
	  c[i][j] = c[i][j-1];
	}
      }
    }
    cout << c[lenx-1][leny-1] << endl;
  }
  return 0;
}

C++: #include<iostream>
using namespace std;
#include<string>

int S[1001][1001];

void prep(string str1, string str2, int len1, int len2)
{
    int a, b, i;
    S[0][0] = 0;
    for(i = 1; i <= len1; i++){ S[i][0] = 0; }
    for(i = 1; i <= len2; i++){ S[0][i] = 0; }
    for(a = 1; a <= len1; a++){
        for(b = 1; b <= len2; b++){
            if(str1[a - 1] == str2[b - 1]){ S[a][b] = 1; }else{ S[a][b] = 0; }
        }
    }
    return;
}

int main()
{
    int i, a, b, q, len1, len2;
    cin >> q;
    string str1, str2;

    for(i = 0; i < q; i++){
        cin >> str1 >> str2;
        len1 = str1.size();
        len2 = str2.size();
        prep(str1, str2, len1, len2);
        for(a = 1; a <= len1; a++){
            for(b = 1; b <= len2; b++){
                if(S[a][b]){ S[a][b] = S[a - 1][b - 1] + 1; }
                else{ S[a][b] = max(S[a - 1][b], S[a][b - 1]); }
            }
        }
		cout << S[len1][len2] << endl;
    }
    return 0;
}

C++: #include<iostream>
#include<string>
#include<algorithm>
using namespace std;

static const int N = 1000;

int lcs(string X, string Y) {
    int c[N+1][N+1];
    int m = X.size();
    int n = Y.size();
    int maxl = 0;
    X = ' ' + X;
    Y = ' ' + Y;
    for (int i = 1; i <= m; i++) {
        c[i][0] = 0;
    }
    for (int j = 1; j <= n; j++) {
        c[0][j] = 0;
    }

    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (X[i] == Y[j]) {
                c[i][j] = c[i - 1][j - 1] + 1;
            }else {
                c[i][j] = max(c[i - 1][j], c[i][j - 1]);
            }
            maxl = max(maxl, c[i][j]);
        }
    }

    return maxl;
}

int main()
{
    string s1, s2;
    int n; cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> s1 >> s2;
        cout << lcs(s1, s2) << endl;
    }
    return 0;
}

C++: #include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int lcs(string X, string Y) {
    int m = X.size();
    int n = Y.size();
    int c[m+1][n+1];
    int maxl = 0;
    X = ' ' + X;    // insert empty to X[0]
    Y = ' ' + Y;    // insert empty to Y[0]
    for (int i = 0; i <= m; i++) { c[i][0] = 0; }
    for (int j = 1; j <= n; j++) { c[0][j] = 0; }

    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (X[i] == Y[j]) {
                c[i][j] = c[i-1][j-1] + 1;
            } else {
                c[i][j] = max(c[i-1][j], c[i][j-1]);
            }
        }
    }

    return c[m][n];
}

int main() {
    int n;
    scanf("%d", &n);

    for (int i = 0; i < n; i++) {
        string s1, s2;
        cin >> s1 >> s2;
        printf("%d\n", lcs(s1, s2));
    }
    return 0;
}