#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
int n,s[N],t[N],f1[N][6],f2[N][6],res;
//f1[i][j]:前i个数里面组成的序列 序列最后一个数的共鸣数字是j的序列集合 属性:maxlen s[i]可能被取也可能不被取 t[i]一定不被取
//f2[i][j]:前i个数里面组成的序列 序列最后一个数的共鸣数字是j的序列集合 属性:maxlen t[i]可能被取也可能不被取 s[i]一定不被取
//状态转移(情况比较多,这里只列举f1的,f2是相同的思路):
//1.s[i]包含0/2/4单个 则它可以从f2[i-1][0/2/4]处获得状态转移(数字0/2/4共鸣)
//f1[i][j]=f2[i-1][j]+1;
//2.s[i]包含{0,2}
//f1[i][0]=max(f2[i-1][0]+1,f2[i-1][2]+1),f1[i][2]=max(f[i-1][0]+1,f[i-1][2]+1);
//...坦白来讲 就是从它有的共鸣数字的集合里面取最大的f[i-1][共鸣数字]=a 然后 所有它有的共鸣数字可以更新为a+1
int get(int a){
if(a==0) return 0;
if(a==2) return 1;
if(a==4) return 2;
}
int main()
{
cin>>n;
if(n==1){
cout<<1<<endl;
return 0;
}
for(int i=1;i<=n;i++) cin>>s[i];
for(int i=1;i<=n;i++) cin>>t[i];
memset(f1,-0x3f,sizeof f1),memset(f2,-0x3f,sizeof f2);
for(int i=0;i<=2;i++) f2[0][i]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<3;j++)
f1[i][j]=f1[i-1][j],f2[i][j]=f2[i-1][j];
int a=s[i],b=t[i],maxl=-0x3f;
set<int>st;
while(a){
if(a%10==0||a%10==2||a%10==4) st.insert(get(a%10));
a/=10;
}
for(auto k:st) maxl=max(maxl,f2[i-1][k]);
for(auto k:st) f1[i][k]=max(maxl+1,f1[i][k]);
st.clear(),maxl=-0x3f;
while(b){
if(b%10==0||b%10==2||b%10==4) st.insert(get(b%10));
b/=10;
}
for(auto k:st) maxl=max(maxl,f1[i-1][k]);
for(auto k:st) f2[i][k]=max(f2[i][k],maxl+1);
}
for(int j=0;j<=2;j++)
res=max(res,max(f1[n][j],f2[n][j]));
cout<<res<<endl;
return 0;
}