传送门
输入两个字符串A和B,合并成一个串C,属于A和B的字符在C中顺序保持不变。如"abc"和"xyz"可以被组合成"axbycz"或"abxcyz"等。
我们定义字符串的价值为其最长回文子串的长度(回文串表示从正反两边看完全一致的字符串,如"aba"和"xyyx")。
需要求出所有可能的C中价值最大的字符串,输出这个最大价值即可
输入描述:
第一行一个整数T(T ≤ 50)。 接下来2T行,每两行两个字符串分别代表A,B(|A|,|B| ≤ 50),A,B的字符集为全体小写字母。
输出描述:
对于每组数据输出一行一个整数表示价值最大的C的价值。
示例1
输入
复制2 aa bb a aaaabcaa
2 aa bb a aaaabcaa
输出
复制4 5
4 5
思路:
数据只有50,那么dp数组应该是开3维或者是4维。
假设第一个字符串为a,长度为l,第二个字符串为b,长度为r。
我们设,即在a串里面选取到,在b串里面选取到。
因为想要为回文串,那么第一个一定是等于最后一个才有希望组成回文串。
那么状态转移方程式就为:
然后对每个的取(x+y)的最大值即可。
AC代码:
//
// ................ .................,`..,`.................
// .....=^..=^..=^. .=^..=^..=^..=^..=^..=^..=^...*.........
// ...*,/\`,/\^,\..,\..,\..,/\`,/\`,/\`...*...* ...*,\..,\..,\..,\..,\..,\..,\..=^=^,`,`,`,`
// .,].=^..=^=^,`=^,`=^,`=^=^..=^..=^...,]..,]. .,].,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^*.........
// .....................,`..,`..,`..................................... .....,`..,`..,`..,`..,`..,`..,`.
// .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^. .=^..=^..=^..=^..=^..=^.........
// ,[\^,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,/\`,/\`,\..,\..,\..,\..,\..,\..,`,`
// ,/*.,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^..=^..,`=^,`=^,`=^,`=^,`=^,`=^....
// .............,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..........,`..,`..,`..,`..,`..,`.
// .....=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.........
// ...*,/\^,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,`,`
// .,].=^=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^....
// .............,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.........
// .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.
// ...*,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,/\`...*...*
// .,].,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^...,]..,].
// .........,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.....................................
// .=^..=^..............................................=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.....
// ...*,\..,\...\/`.\/`.\/`.\/`,`,`,`,`,`,`,`,`.\/`.\/`.\/`,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..=/\`,/\`...*
// .,].,`=^,`=^.[,`.[,`.[,`.[,`.................[,`.[,`.[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^=^=^...,].
// .,`..,`. .,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.................
// ........ .............................=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.....
// ,`,`,`,`.\/`.\/`,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..=^..
// .........[,`.[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^..
// .....,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.....
// .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.
// ,[\^,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..
// ,/*.,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^
// .........,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.
// .=^..=^..=^..=^..=^..=^..=^..=^.. ...........=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^..=^.
// ...*,\..,\..,\..,\..,\..,\..,\..,\..=^=^.\/`.\/`,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..
// .,].,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^*..[,`.[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^
// .........,`..,`..,`..,`..,`..,`..,`..,`. .,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.
// .....=^..=^..=^..=^..=^..=^..=^......... .............................................=^..=^..=^..=^..=^.
// ,/\^,\..,\..,\..,\..,\..,\..,\..,`,` .@=^,\..,\..,\..,\..,\..
// =^=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^.... ,[\/,`=^,`=^,`=^,`=^,`=^
// .........,`..,`..,`..,`..,`..,`..,`. .,`..,`..,`..,`..,`.
// .=^..=^..=^..=^..=^..=^..=^..=^..=^. .=^..=^..=^.. ......
// ,[\^,\..,\..,\..,\..,\..,\..,\..,\..,\.. ,\..,\..,\..=^=^,`,`
// ,/*.,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^ ,`=^,`=^,`=^=^*.....
// .........,`..,`..,`..,`..,`..,`..,`..,`..,`* .,`..,`..,`.
// .....=^..=^..=^..=^..=^..=^..=^..=^..=^....* .=^.. ......
// ,/\^,\..,\..,\..,\..,\..,\..,\..,\..,\..=^.. ,\..=^=^,`,`
// =^=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^.. ,`=^=^*.....
// .....,`..,`..,`..,`..,`..,`..,`..,`..,`....* .,`.
// .=^..=^..=^..=^..=^..=^..=^..=^..=^..=^...*. ....
// ,\..,\..,\..,\..,\..,\..,\..,\..,\..,\..=^..
// ,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^=^..
// .,`..,`..,`..,`..,`..,`..,`..,`..,`..,`.....
// .........=^..=^..=^..=^..=^..=^..=^..=^.....
// .\/`,\..,\..,\..,\..,\..,\..,\..,\..,`,`
// .[,`,`=^,`=^,`=^,`=^,`=^,`=^,`=^,`=^....
// .,`..,`..,`..,`..,`..,`..,`..,`.
// ................................
// ,`,`.\/`.\/`.\/`,`,`,`,`
//
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
char a[N],b[N];
int dp[51][51][51][51];
const int INF=1e9;
void solve(){
memset(dp,0,sizeof(dp));
cin>>a;
cin>>b;
int l=strlen(a);
int r=strlen(b);
int maxl=0;
for(int x=0;x<=l;x++){
for(int y=0;y<=r;y++){
for(int j=x,i=1;j<=l;i++,j++){
for(int k=1,s=y;s<=r;s++,k++){
if(x+y<=1) dp[i][j][k][s]=1;
else {
if(a[i-1]==a[j-1]&&x>1){
dp[i][j][k][s]|=dp[i+1][j-1][k][s];
}
if(b[k-1]==b[s-1]&&y>1){
dp[i][j][k][s]|=dp[i][j][k+1][s-1];
}
if(x&&y){
if(a[i-1]==b[s-1]){
dp[i][j][k][s]|=dp[i+1][j][k][s-1];
}
if(a[j-1]==b[k-1]){
dp[i][j][k][s]|=dp[i][j-1][k+1][s];
}
}
}
if(dp[i][j][k][s]){
maxl=max(maxl,x+y);
}
}
}
}
}
cout<<maxl<<'\n';
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t=1;
cin>>t;
while(t--){
solve();
}
}