#include <bits/stdc++.h>
using namespace std;
#define N 8000040
#define ls(id) id*2
#define rs(id) id*2+1
#define mid (l+r)/2
int a[N],z[N][2],n;
vector <int> vc[N/4];
string s1,s2;
void solve(string s,int id,int py){
int l=0,r=0; z[0][id]=s.size();
for (int i=1; i<s.size(); i++){
if (i<=r&&z[i-l][id]<r-i+1) z[i][id]=z[i-l][id];
else{
z[i][id]=max(0,r-i+1);
while (i+z[i][id]<s.size()&&s[z[i][id]]==s[i+z[i][id]]) ++z[i][id];
}if (i+z[i][id]-1>r) l=i,r=i+z[i][id]-1;
}for (int i=1; i<=s.size(); i++) z[i][id]=z[i+py][id];
return;
}
struct Seg_tree{
void change(int now){
a[now]=max(a[ls(now)],a[rs(now)]);
}void update(int now,int l,int r,int id,int val){
if (id==0) return ;
if (l==r){
a[now]=val; return ;
} if (id<=mid) update(ls(now),l,mid,id,val);
else update(rs(now),mid+1,r,id,val);
change(now);
}int query(int now,int l,int r,int ql,int qr){
if (l>r) return 0;
if (ql<=l&&r<=qr) return a[now];
if (qr<=mid) return query(ls(now),l,mid,ql,qr);
if (ql>mid) return query(rs(now),mid+1,r,ql,qr);
return max(query(ls(now),l,mid,ql,qr),query(rs(now),mid+1,r,ql,qr));
}
}tr;
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>n>>s1>>s2; int ans=0;
solve(s2+"#"+s1,0,s2.size());
solve(s1+"#"+s2,1,s1.size());
for (int i=1; i<=n; i++){
vc[z[i][1]].push_back(i);
}for (int i=n; i>=1; i--){
for (auto x:vc[i]) tr.update(1,1,n,x-1,x-1);
ans=max(ans,tr.query(1,1,n,1,z[i+1][0])+i);
}cout<<ans; return 0;
}