#include <bits/stdc++.h> using namespace std; const int MAXN = 55; int dp[MAXN][MAXN][MAXN][MAXN]; int main() { int t; cin >> t; while (t--) { string a, b; cin >> a >> b; memset(dp, 0, sizeof(dp)); int maxn = 0; const int n = a.size(), m = b.size(); // 提前初始化所有 Alen + Blen <= 1 的情况 // 情况1:Alen=0, Blen=0(空字符串) for (int i = 0; i <= n; i++) { for (int j = 0; j <= m; j++) { dp[i][i][j][j] = 1; // 空字符串是回文 maxn = max(maxn, 0); // 更新最大长度 } } // 情况2:Alen=1, Blen=0(A中取1字符) for (int i = 0; i < n; i++) { // i范围[0,n-1] for (int j = 0; j <= m; j++) { dp[i][i + 1][j][j] = 1; // 子串a[i..i] maxn = max(maxn, 1); } } // 情况3:Alen=0, Blen=1(B中取1字符) for (int j = 0; j < m; j++) { // j范围[0,m-1] for (int i = 0; i <= n; i++) { dp[i][i][j][j + 1] = 1; // 子串b[j..j] maxn = max(maxn, 1); } } // 主循环处理 Alen + Blen >= 2 的情况 for (int Alen = 0; Alen <= n; Alen++) { for (int Blen = 0; Blen <= m; Blen++) { if (Alen + Blen < 2) continue; // 跳过已初始化的情况 for (int i = 0; i + Alen <= n; i++) { int endA = i + Alen; for (int j = 0; j + Blen <= m; j++) { int endB = j + Blen; // 状态转移(无需再判断 Alen+Blen<=1) if (Alen >= 2 && a[i] == a[endA - 1]) dp[i][endA][j][endB] = max(dp[i][endA][j][endB], dp[i + 1][endA - 1][j][endB]); if (Blen >= 2 && b[j] == b[endB - 1]) dp[i][endA][j][endB] = max(dp[i][endA][j][endB], dp[i][endA][j + 1][endB - 1]); if (Alen >= 1 && Blen >= 1 && a[i] == b[endB - 1]) dp[i][endA][j][endB] = max(dp[i][endA][j][endB], dp[i + 1][endA][j][endB - 1]); if (Alen >= 1 && Blen >= 1 && a[endA - 1] == b[j]) dp[i][endA][j][endB] = max(dp[i][endA][j][endB], dp[i][endA - 1][j + 1][endB]); if (dp[i][endA][j][endB]) maxn = max(maxn, Alen + Blen); } } } } cout << maxn << endl; } return 0; }