
对于第i(1<=i<=n)列为最终状态,分为3种情况
f[0][i]表示这列的没有'*'
f[1][i]表示这列有且仅有第一行有'*'
f[2][i]表示这列有且仅有第二行有'*'
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10,INF = 0x3f3f3f3f;
char g[2][N];
int f[3][N];
int main(){
int test;
cin>>test;
while(test--){
int n;
cin>>n>>g[0]+1>>g[1]+1;
for(int i=n;i>=0;i--){
if(g[0][i]=='*' || g[1][i]=='*'){
n=i;
break;
}
}
memset(f,0x3f,sizeof f);
f[0][0]=0;
for(int i=1;i<=n;i++){
if(g[0][i]!='*' && g[1][i]!='*'){
f[0][i]=f[0][i-1];
f[1][i]=min(f[1][i-1]+1,f[2][i-1]+2);
f[2][i]=min(f[1][i-1]+2,f[2][i-1]+1);
}
else if(g[0][i]=='*' && g[1][i]!='*'){
f[1][i]=min({f[0][i-1],f[1][i-1]+1,f[2][i-1]+2});
f[2][i]=min({f[0][i-1]+1,f[1][i-1]+2,f[2][i-1]+2});
}
else if(g[0][i]!='*' && g[1][i]=='*'){
f[1][i]=min({f[0][i-1]+1,f[1][i-1]+2,f[2][i-1]+2});
f[2][i]=min({f[0][i-1],f[1][i-1]+2,f[2][i-1]+1});
}
else{
f[1][i]=min({f[0][i-1]+1,f[1][i-1]+2,f[2][i-1]+2});
f[2][i]=min({f[0][i-1]+1,f[1][i-1]+2,f[2][i-1]+2});
}
}
cout<<min(f[1][n],f[2][n])<<endl;
}
return 0;
}