description: A binary string is a string that consists of characters 0 and 1. A bi-table is a table that has exactly two rows of equal length, each being a binary string.
  
  Let \operatorname{MEX} of a bi-table be the smallest digit among 0, 1, or 2 that does not occur in the bi-table. For example, \operatorname{MEX} for \begin{bmatrix} 0011\\\ 1010 \end{bmatrix} is 2, because 0 and 1 occur in the bi-table at least once. \operatorname{MEX} for \begin{bmatrix} 111\\\ 111 \end{bmatrix} is 0, because 0 and 2 do not occur in the bi-table, and 0 < 2.
  
  You are given a bi-table with n columns. You should cut it into any number of bi-tables (each consisting of consecutive columns) so that each column is in exactly one bi-table. It is possible to cut the bi-table into a single bi-table — the whole bi-table.
  
  What is the maximal sum of \operatorname{MEX} of all resulting bi-tables can be?
  
  Input
  
  The input consists of multiple test cases. The first line contains a single integer t (1 ≤ t ≤ 10^4) — the number of test cases. Description of the test cases follows.
  
  The first line of the description of each test case contains a single integer n (1 ≤ n ≤ 10^5) — the number of columns in the bi-table.
  
  Each of the next two lines contains a binary string of length n — the rows of the bi-table.
  
  It's guaranteed that the sum of n over all test cases does not exceed 10^5.
  
  Output
  
  For each test case print a single integer — the maximal sum of \operatorname{MEX} of all bi-tables that it is possible to get by cutting the given bi-table optimally.
  
  Example
  
  Input
  
  
  4
  7
  0101000
  1101100
  5
  01100
  10101
  2
  01
  01
  6
  000000
  111111
  
  
  Output
  
  
  8
  8
  2
  12
  
  Note
  
  In the first test case you can cut the bi-table as follows:
  
    * \begin{bmatrix} 0\\\ 1 \end{bmatrix}, its \operatorname{MEX} is 2.
    * \begin{bmatrix} 10\\\ 10 \end{bmatrix}, its \operatorname{MEX} is 2.
    * \begin{bmatrix} 1\\\ 1 \end{bmatrix}, its \operatorname{MEX} is 0.
    * \begin{bmatrix} 0\\\ 1 \end{bmatrix}, its \operatorname{MEX} is 2.
    * \begin{bmatrix} 0\\\ 0 \end{bmatrix}, its \operatorname{MEX} is 1.
    * \begin{bmatrix} 0\\\ 0 \end{bmatrix}, its \operatorname{MEX} is 1.
  
  
  
  The sum of \operatorname{MEX} is 8.
solution: import java.io.*;
  import java.util.*;
  import java.math.*;
  public class Solution {
      InputStream is;
      PrintWriter o;
      /////////////////// CODED++ BY++ ++ ++ ++ BHAVYA++ ARORA++ ++ ++ ++ FROM++ JAYPEE++ INSTITUTE++ OF++ INFORMATION++ TECHNOLOGY++ ////////////////
  ///////////////////////// Make it work, make it right, make it fast. Make it work, make it right, make it fast. Make it work, make it right, make it fast. Make it work, make it right, make it fast. /////////////////
   void solve() {
       int t=ni();
       while(t-->0){
           int n=ni();
          char s1[]=ns().toCharArray();
          char s2[]=ns().toCharArray();
          boolean vis[]=new boolean[n];
          long res=0;
          for(int i=0;i<n;i++){
              if((s1[i]=='0'&&s2[i]=='1')||(s1[i]=='1'&&s2[i]=='0')){
                  res+=2;
                  // o.println(res+" c1");
                  continue;
              }
              if(s1[i]=='0'&&s2[i]=='0'){
                  // o.println(res+" c2");
  
                  res++;
              }
  
              if(i!=0){
                  if(vis[i-1]==false&&(s1[i]=='0'&&s2[i]=='0')&&(s1[i-1]=='1')&&s2[i-1]=='1'){
                      // o.println(res+" c3");
                      vis[i]=true;
  
                      res++;
                  }
  
                  if(vis[i-1]==false&&(s1[i]=='1'&&s2[i]=='1')&&(s1[i-1]=='0')&&s2[i-1]=='0'){
                      // o.println(res+" c4");
                      vis[i]=true;
                      res++;
                  }
  
                  
  
              }
              
  
          }
          o.println(res);
         
       }
  }
     //---------- I/O Template ----------
      public static void main(String[] args) { new Solution().run(); }
      void run() { 
          is = System.in; 
          o = new PrintWriter(System.out);
          solve();
          o.flush();
      }
      byte input[] = new byte[1024];
      int len = 0, ptr = 0;
      int readByte() { 
          if(ptr >= len) { ptr = 0; 
              try { len = is.read(input); } 
              catch(IOException e) { throw new InputMismatchException(); } 
              if(len <= 0) { return -1; } 
          } return input[ptr++];
      }
      boolean isSpaceChar(int c) { return !( c >= 33 && c <= 126 ); }
      int skip() { 
          int b = readByte(); 
          while(b != -1 && isSpaceChar(b)) { b = readByte(); } 
          return b;
      }
      char nc() { return (char)skip(); }
      String ns() { 
          int b = skip(); 
          StringBuilder sb = new StringBuilder(); 
          while(!isSpaceChar(b)) { sb.appendCodePoint(b); b = readByte(); } 
          return sb.toString();
      }
      String nLine() { 
          int b = skip(); 
          StringBuilder sb = new StringBuilder(); 
          while( !(isSpaceChar(b) && b != ' ') ) { sb.appendCodePoint(b); b = readByte(); } 
          return sb.toString();
      }
      int ni() { 
          int n = 0, b = readByte(); 
          boolean minus = false;
          while(b != -1 && !( (b >= '0' && b <= '9') || b == '-')) { b = readByte(); } 
          if(b == '-') { minus = true; b = readByte(); } 
          if(b == -1) { return -1; }  //no input 
          while(b >= '0' && b <= '9') { n = n * 10 + (b - '0'); b = readByte(); } 
          return minus ? -n : n;
      }
      long nl() { 
          long n = 0L;    int b = readByte(); 
          boolean minus = false; 
          while(b != -1 && !( (b >= '0' && b <= '9') || b == '-')) { b = readByte(); } 
          if(b == '-') { minus = true; b = readByte(); } 
          while(b >= '0' && b <= '9') { n = n * 10 + (b - '0'); b = readByte(); } 
          return minus ? -n : n;
      }
      double nd() { return Double.parseDouble(ns()); }
      float nf() { return Float.parseFloat(ns()); }
      int[] nia(int n) { 
          int a[] = new int[n]; 
          for(int i = 0; i < n; i++) { a[i] = ni(); } 
          return a;
      }
      long[] nla(int n) { 
          long a[] = new long[n]; 
          for(int i = 0; i < n; i++) { a[i] = nl(); } 
          return a;
      }
      int [][] nim(int n)
      {
          int mat[][]=new int[n][n];
          for(int i=0;i<n;i++)
          {
              for(int j=0;j<n;j++)
              {
                  mat[i][j]=ni();
              }
          }
          return mat;
      }
      long [][] nlm(int n)
      {
          long mat[][]=new long[n][n];
          for(int i=0;i<n;i++)
          {
              for(int j=0;j<n;j++)
              {
                  mat[i][j]=nl();
              }
          }
          return mat;
      }
      char[] ns(int n) { 
          char c[] = new char[n]; 
          int i, b = skip(); 
          for(i = 0; i < n; i++) { 
              if(isSpaceChar(b)) { break; } 
              c[i] = (char)b; b = readByte(); 
          } return i == n ? c : Arrays.copyOf(c,i);
      }
      void piarr(int arr[])
      {
          for(int i=0;i<arr.length;i++)
          {
              o.print(arr[i]+" ");
          }
          o.println();
      }
      void plarr(long arr[])
      {
          for(int i=0;i<arr.length;i++)
          {
              o.print(arr[i]+" ");
          }
          o.println();
      }
      void pimat(int mat[][])
      {
          for(int i=0;i<mat.length;i++)
          {
              for(int j=0;j<mat[0].length;j++)
              {
                  o.print(mat[i][j]+" ");
              }
              o.println();
          }
      }
      void plmat(long mat[][])
      {
          for(int i=0;i<mat.length;i++)
          {
              for(int j=0;j<mat[0].length;j++)
              {
                  o.print(mat[i][j]+" ");
              }
              o.println();
          }
      }
     static class DJset
  {
  int n;
  ty1 arr[];
  class ty1
  {
      int rank;
      int par;
      ty1(int p,int r)
      {
          par=p;
          rank=r;
      }
  }
  DJset(int nu)
  {
      n=nu;
      arr=new ty1[n];
      for(int i=0;i<n;i++)
      {
          arr[i]=new ty1(i,1);
      }
  }
  int find(int x)
  {
      if(arr[x].par!=x)
      {
          arr[x].par=find(arr[x].par);
      }
      return arr[x].par;
  }
  void union(int x,int y)
  {
      x=find(x);
      y=find(y);
      if(x!=y)
      {
          if(arr[x].rank<arr[y].rank)
          {
              arr[x].par=y;
          }
          else if(arr[y].rank<arr[x].rank)
          {
              arr[y].par=x;
          }
          else
          {
              arr[x].rank++;
              arr[y].par=x;
          }
      }
  }
  public String toString()
  {
      String res="";
      for(int i=0;i<n;i++)
      {
          res+=(arr[i].par+" ");
      }
      return res;
  }
  public int countsets()
  {
      int res=0;
      for(int i=0;i<n;i++)
      {
          if(arr[i].par==i)
          {
              res++;
          }
      }
      return res;
  }
  }
      //////////////////////////////////// template finished //////////////////////////////////////
  }