/* Author : Koulick Sadhu Date : 08-04-2022 Time : 12:55:25 */ #include <bits/stdc++.h> using namespace std; struct state { int len, link; map<char, int> next; state(){ len = 0; link = 0; next.clear(); } }; const int MAXLEN =100005; state st[MAXLEN * 2]; int sz, last; void sa_init() { st[0].len = 0; st[0].link = -1; sz++; last = 0; } void sa_reset(){ for(int i = 0; i < sz; i++){ st[i].len = 0; st[i].link = 0; st[i].next.clear(); } sz = last = 0; } void sa_extend(char c) { int cur = sz++; st[cur].len = st[last].len + 1; int p = last; while (p != -1 && !st[p].next.count(c)) { st[p].next[c] = cur; p = st[p].link; } if (p == -1) { st[cur].link = 0; } else { int q = st[p].next[c]; if (st[p].len + 1 == st[q].len) { st[cur].link = q; } else { int clone = sz++; st[clone].len = st[p].len + 1; st[clone].next = st[q].next; st[clone].link = st[q].link; while (p != -1 && st[p].next[c] == q) { st[p].next[c] = clone; p = st[p].link; } st[q].link = st[cur].link = clone; } } last = cur; } int lcs (string &S, string &T) { sa_init(); for (int i = 0; i < S.size(); i++) sa_extend(S[i]); int v = 0, l = 0, best = 0, bestpos = 0; for (int i = 0; i < T.size(); i++) { while (v && !st[v].next.count(T[i])) { v = st[v].link ; l = st[v].len; } if (st[v].next.count(T[i])) { v = st [v].next[T[i]]; l++; } if (l > best) { best = l; bestpos = i; } } string res = T.substr(bestpos - best + 1, best); return res.length(); } int main() { #ifndef ONLINE_JUDGE freopen("input.txt","r", stdin); freopen("output.txt","w",stdout); #endif int t = 1; cin >> t; while (t--) { int n; cin >> n; string a; cin >> a; string b; cin >> b; cout<<lcs(a, b)<<endl; sa_reset(); } return 0; }