#include <bits/stdc++.h>
using namespace std;
using ll = long long;
long long readInt(long long l,long long r,char endd){
long long x=0;
int cnt=0;
int fi=-1;
bool is_neg=false;
while(true){
char g=getchar();
if(g=='-'){
assert(fi==-1);
is_neg=true;
continue;
}
if('0'<=g && g<='9'){
x*=10;
x+=g-'0';
if(cnt==0){
fi=g-'0';
}
cnt++;
assert(fi!=0 || cnt==1);
assert(fi!=0 || is_neg==false);
assert(!(cnt>19 || ( cnt==19 && fi>1) ));
} else if(g==endd){
if(is_neg){
x= -x;
}
assert(l<=x && x<=r);
return x;
} else {
assert(false);
}
}
}
string readString(int l,int r,char endd){
string ret="";
int cnt=0;
while(true){
char g=getchar();
assert(g!=-1);
if(g==endd){
break;
}
cnt++;
ret+=g;
}
assert(l<=cnt && cnt<=r);
return ret;
}
long long readIntSp(long long l,long long r){
return readInt(l,r,' ');
}
long long readIntLn(long long l,long long r){
return readInt(l,r,'\n');
}
string readStringLn(int l,int r){
return readString(l,r,'\n');
}
string readStringSp(int l,int r){
return readString(l,r,' ');
}
long long P10(int x){
return x == 0 ? 1 : 10 * P10(x - 1);
}
template <typename T, typename R = long long>
vector<T> readArr(int len, R l, R r){
vector<T> a(len);
for(int i = 0; i < len; i++){
if(i + 1 < len){
a[i] = readIntSp(l, r);
} else {
a[i] = readIntLn(l, r);
}
}
return a;
}
struct suffix_aut {
vector<map<int,int>> to;
vector<int> len, link, cnt;
int get_node(){
to.emplace_back();
len.emplace_back();
link.emplace_back();
cnt.emplace_back();
return (int)to.size() - 1;
}
int last;
suffix_aut(){
get_node();
link[0] = -1;
last = 0;
}
int adj(int u, int c){
auto it = to[u].find(c);
if(it == to[u].end()) return -1;
return it->second;
}
void extend(int c){
int cur = get_node(), p;
len[cur] = len[last] + 1;
cnt[cur] = 1;
for(p = last; p != -1 && adj(p, c) == -1; p = link[p])
to[p][c] = cur;
if(p == -1)
link[cur] = 0;
else {
int q = to[p][c];
if(len[p] + 1 == len[q])
link[cur] = q;
else {
int cln = get_node();
to[cln] = to[q];
len[cln] = len[p] + 1;
link[cln] = link[q];
link[q] = cln;
link[cur] = cln;
for(; p != -1 && adj(p, c) == q; p = link[p])
to[p][c] = cln;
}
}
last = cur;
}
void augment(){
int sz = len.size();
vector<int> deg(sz, 0);
for(int i = 1; i < sz; i++) deg[link[i]]++;
queue<int> q;
for(int i = 1; i < sz; i++) if(deg[i] == 0) q.push(i);
while(!q.empty()){
int u = q.front(); q.pop();
if(link[u]){
cnt[link[u]] += cnt[u];
if(--deg[link[u]] == 0)
q.push(link[u]);
}
}
}
};
int main(){
int t = readIntLn(1, P10(3));
int sum_n = 0;
while(t--){
int n = readIntLn(1, P10(5));
sum_n += n;
string A = readStringLn(n, n);
string B = readStringLn(n, n);
for(auto c : A) assert(c == '0' || c == '1');
for(auto c : B) assert(c == '0' || c == '1');
suffix_aut suf;
for(auto c : A) suf.extend(c);
int ans = 0, len = 0, cur = 0;
for(auto c : B){
int nxt;
while(cur != -1 && (nxt = suf.adj(cur, c)) == -1){
cur = suf.link[cur];
len = suf.len[cur];
}
if(nxt == -1){
cur = 0;
len = 0;
} else {
cur = nxt;
len += 1;
}
ans = max(ans, len);
}
cout << ans << '\n';
}
assert(1 <= sum_n && sum_n <= 5 * P10(5));
return 0;
}