#include <bits/stdc++.h>
using namespace std;
const int km = 10;
int main() {
  int n;
  cin >> n;
  vector<string> pref(n), post(n);
  vector<vector<unordered_set<string>>> subs(
      n, vector<unordered_set<string>>(km + 1));
  for (int i = 0; i < n; ++i) {
    string str;
    cin >> str;
    pref[i] = str.substr(0, km);
    post[i] = str.substr(max(0, (int)(str).size() - km), km);
    for (int k = 1; k <= km; ++k)
      for (int j = 0; j < (int)(str).size() - k + 1; ++j)
        subs[i][k].insert(str.substr(j, k));
  }
  int m;
  cin >> m;
  for (int i = 0; i < m; ++i) {
    int ai, bi;
    cin >> ai >> bi;
    ai--;
    bi--;
    pref.push_back((pref[ai] + pref[bi]).substr(0, km));
    post.push_back(
        (post[ai] + post[bi])
            .substr(max(0, (int)(post[ai] + post[bi]).size() - km), km));
    subs.push_back(vector<unordered_set<string>>(km + 1));
    string str = post[ai] + pref[bi];
    int res = 0;
    for (int k = 1; k <= km; ++k) {
      subs.back()[k].insert(subs[ai][k].begin(), subs[ai][k].end());
      subs.back()[k].insert(subs[bi][k].begin(), subs[bi][k].end());
      for (int j = 0; j < (int)(str).size() - k + 1; ++j)
        subs.back()[k].insert(str.substr(j, k));
      if ((int)(subs.back()[k]).size() == (1 << k)) res = k;
    }
    cout << res << endl;
  }
}
