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.*;
  
  public class A {
  
  	static Scanner sc = new Scanner(System.in);
  	// static Reader sc = new Reader();
  	static StringBuilder out = new StringBuilder();
  
  	static String testCase = "Case #";
  	static long mod = 998244353;
  	static long fac[] = new long[3 * (int) 1e5];
  
  	public static void main(String[] args) throws IOException {
  		// TODO Auto-generated method stub
  
  		int t =  sc.nextInt();
  
  		int tc = 0;
  
  		fac[0] = 1;
  
  		for (int i = 1; i < fac.length; i++) {
  
  			fac[i] = fac[i - 1] * i;
  			fac[i] %= mod;
  		}
  
  		while (tc++ < t) {
  			// out.append(testCase + tc + ": ");
  			A run = new A();
  
  			run.run();
  		}
  
  		System.out.println(out);
  
  	}
  
  	static int a[][];
  
  	static ArrayList<Long> al = new ArrayList<>();
  
  	static class pair implements Comparable<pair> {
  
  		int f, s;
  
  		pair(int f, int s) {
  			this.f = f;
  			this.s = s;
  
  		}
  
  		@Override
  		public int compareTo(pair o) {
  			// TODO Auto-generated method stub
  
  			return o.s - this.s;
  
  		}
  
  	}
  
  	public void run() throws IOException {
  
  		
  		int n=sc.nextInt();
  
  	
  		String s=sc.next(),s1=sc.next();
  		
  		
  		
  		
  		
  		int i=0;
  		int ans=0;
  		while(i<n) {
  			
  			
  			int z=0;
  			int o=0;
  			
  			if(s.charAt(i)=='0')z++;
  			else o++;
  			
  			if(s1.charAt(i)=='0')z++;
  			else o++;
  			
  			if(z==1 && o==1) {
  				ans+=2;
  				i++;
  				continue;
  				
  			}
  			int z1=0;
  			int o1=0;
  			
  			if(i<n-1) {
  				
  				
  				if(s.charAt(i+1)=='0')z1++;
  				else o1++;
  				
  				if(s1.charAt(i+1)=='0')z1++;
  				else o1++;
  				
  			}
  			
  			if((z==2 && o1==2) || (o==2 && z1==2)) {
  				
  				ans+=2;
  				i+=2;
  				continue;
  			}
  			
  			if(z>0)ans++;
  			
  			i++;
  			
  		}
  		
  		out.append(ans+"\n");
  		
  
  	}
  
  	static long modInverse(long a, long m) {
  		long m0 = m;
  		long y = 0, x = 1;
  
  		if (m == 1)
  			return 0;
  
  		while (a > 1) {
  			// q is quotient
  			long q = a / m;
  
  			long t = m;
  
  			m = a % m;
  			a = t;
  			t = y;
  
  			// Update x and y
  			y = x - q * y;
  			x = t;
  		}
  
  		// Make x positive
  		if (x < 0)
  			x += m0;
  
  		return x;
  	}
  
  	static class Reader {
  		final private int BUFFER_SIZE = 1 << 16;
  		private DataInputStream din;
  		private byte[] buffer;
  		private int bufferPointer, bytesRead;
  
  		public Reader() {
  			din = new DataInputStream(System.in);
  			buffer = new byte[BUFFER_SIZE];
  			bufferPointer = bytesRead = 0;
  		}
  
  		public Reader(String file_name) throws IOException {
  			din = new DataInputStream(new FileInputStream(file_name));
  			buffer = new byte[BUFFER_SIZE];
  			bufferPointer = bytesRead = 0;
  		}
  
  		public String readLine() throws IOException {
  			byte[] buf = new byte[64]; // line length
  			int cnt = 0, c;
  			while ((c = read()) != -1) {
  				if (c == '\n') {
  					if (cnt != 0) {
  						break;
  					} else {
  						continue;
  					}
  				}
  				buf[cnt++] = (byte) c;
  			}
  			return new String(buf, 0, cnt);
  		}
  
  		public int nextInt() throws IOException {
  			int ret = 0;
  			byte c = read();
  			while (c <= ' ') {
  				c = read();
  			}
  			boolean neg = (c == '-');
  			if (neg)
  				c = read();
  			do {
  				ret = ret * 10 + c - '0';
  			} while ((c = read()) >= '0' && c <= '9');
  
  			if (neg)
  				return -ret;
  			return ret;
  		}
  
  		public long nextLong() throws IOException {
  			long ret = 0;
  			byte c = read();
  			while (c <= ' ')
  				c = read();
  			boolean neg = (c == '-');
  			if (neg)
  				c = read();
  			do {
  				ret = ret * 10 + c - '0';
  			} while ((c = read()) >= '0' && c <= '9');
  			if (neg)
  				return -ret;
  			return ret;
  		}
  
  		public double nextDouble() throws IOException {
  			double ret = 0, div = 1;
  			byte c = read();
  			while (c <= ' ')
  				c = read();
  			boolean neg = (c == '-');
  			if (neg)
  				c = read();
  
  			do {
  				ret = ret * 10 + c - '0';
  			} while ((c = read()) >= '0' && c <= '9');
  
  			if (c == '.') {
  				while ((c = read()) >= '0' && c <= '9') {
  					ret += (c - '0') / (div *= 10);
  				}
  			}
  
  			if (neg)
  				return -ret;
  			return ret;
  		}
  
  		private void fillBuffer() throws IOException {
  			bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
  			if (bytesRead == -1)
  				buffer[0] = -1;
  		}
  
  		private byte read() throws IOException {
  			if (bufferPointer == bytesRead)
  				fillBuffer();
  			return buffer[bufferPointer++];
  		}
  
  		public void close() throws IOException {
  			if (din == null)
  				return;
  			din.close();
  		}
  	}
  
  }