#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define SIZE 102
int N;
int cases;
int n1,n2;
char gene1[SIZE];
char gene2[SIZE];
int result = 0;
int dp[SIZE][SIZE];
const int table[5][5]= {
5,-1,-2,-1,-3,
-1, 5,-3,-2,-4,
-2,-3, 5,-2,-2,
-1,-2,-2, 5,-1,
-3,-4,-2,-1,0
};
int mapto(char m)
{
switch(m){
case 'A':return 0;
case 'C':return 1;
case 'G':return 2;
case 'T':return 3;
case '-':return 4;
}
return 0;
}
int match(char m1, char m2)
{
int score = 0;
int p1,p2;
p1 = mapto(m1);
p2 = mapto(m2);
score = table[p1][p2];
return score;
}
void Input ()
{
scanf("%d",&n1);
for(int i=1;i<=n1;i++){
scanf("%c",&gene1[i]);
while(gene1[i]==10||gene1[i]==13||gene1[i]==' '){
scanf("%c",&gene1[i]);
}
}
scanf("%d",&n2);
for(int i=1;i<=n2;i++){
scanf("%c",&gene2[i]);
while(gene2[i]==10||gene2[i]==13||gene2[i]==' '){
scanf("%c",&gene2[i]);
}
}
} /* ----- end of function Input ----- */
void Solve ()
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n1;i++){
dp[i][0] = dp[i-1][0] + match(gene1[i],'-');
}
for(int i=1;i<=n2;i++){
dp[0][i] = dp[0][i-1] + match(gene2[i],'-');
}
for(int i=1;i<=n1;i++){
for(int j=1;j<=n2;j++){
dp[i][j] = dp[i-1][j-1] + match(gene1[i],gene2[j]);
int stmp = dp[i-1][j]+match(gene1[i],'-');
if(stmp > dp[i][j]){
dp[i][j] = stmp;
}
stmp = dp[i][j-1]+match(gene2[j],'-');
if(stmp > dp[i][j]){
dp[i][j] = stmp;
//cout<<dp[i][j]<<endl;
}
}
}
result = dp[n1][n2];
} /* ----- end of function Solve ----- */
void Output ()
{
printf("%d\n",result);
} /* ----- end of function Output ----- */
int main ()
{
int K;
scanf("%d",&K);
for(cases=1;cases<=K;cases++){
Input();
Solve();
Output();
}
return 0;
} /* ---------- end of function main ---------- */
#include <cstring>
#include <cstdio>
using namespace std;
#define SIZE 102
int N;
int cases;
int n1,n2;
char gene1[SIZE];
char gene2[SIZE];
int result = 0;
int dp[SIZE][SIZE];
const int table[5][5]= {
5,-1,-2,-1,-3,
-1, 5,-3,-2,-4,
-2,-3, 5,-2,-2,
-1,-2,-2, 5,-1,
-3,-4,-2,-1,0
};
int mapto(char m)
{
switch(m){
case 'A':return 0;
case 'C':return 1;
case 'G':return 2;
case 'T':return 3;
case '-':return 4;
}
return 0;
}
int match(char m1, char m2)
{
int score = 0;
int p1,p2;
p1 = mapto(m1);
p2 = mapto(m2);
score = table[p1][p2];
return score;
}
void Input ()
{
scanf("%d",&n1);
for(int i=1;i<=n1;i++){
scanf("%c",&gene1[i]);
while(gene1[i]==10||gene1[i]==13||gene1[i]==' '){
scanf("%c",&gene1[i]);
}
}
scanf("%d",&n2);
for(int i=1;i<=n2;i++){
scanf("%c",&gene2[i]);
while(gene2[i]==10||gene2[i]==13||gene2[i]==' '){
scanf("%c",&gene2[i]);
}
}
} /* ----- end of function Input ----- */
void Solve ()
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n1;i++){
dp[i][0] = dp[i-1][0] + match(gene1[i],'-');
}
for(int i=1;i<=n2;i++){
dp[0][i] = dp[0][i-1] + match(gene2[i],'-');
}
for(int i=1;i<=n1;i++){
for(int j=1;j<=n2;j++){
dp[i][j] = dp[i-1][j-1] + match(gene1[i],gene2[j]);
int stmp = dp[i-1][j]+match(gene1[i],'-');
if(stmp > dp[i][j]){
dp[i][j] = stmp;
}
stmp = dp[i][j-1]+match(gene2[j],'-');
if(stmp > dp[i][j]){
dp[i][j] = stmp;
//cout<<dp[i][j]<<endl;
}
}
}
result = dp[n1][n2];
} /* ----- end of function Solve ----- */
void Output ()
{
printf("%d\n",result);
} /* ----- end of function Output ----- */
int main ()
{
int K;
scanf("%d",&K);
for(cases=1;cases<=K;cases++){
Input();
Solve();
Output();
}
return 0;
} /* ---------- end of function main ---------- */