int f(string prefix, string suffix) {
    auto p = t_prefix.find(prefix);
    reverse(suffix.begin(), suffix.end());
    auto q = t_suffix.find(suffix);
    if (p == nullptr || q == nullptr) return -1;

    auto m = p->get();
    auto n = q->get();
    int i = m.size()-1;
    int j = n.size()-1;
    while (i>= 0 && j >= 0 && m[i] != n[j]) {
      if (m[i] > n[j]) {
        i--;
      }
      else {
        j--;
      }
    }

    if (i >= 0 && j >= 0 && m[i] == n[j])
      return m[i];
    return -1;
  }
	void find(string &str, int pos, int bitm, ll lvl = 0){
		bitmask |= bitm;
		if(bitmask == finalbit){
			res = max(res, lvl);
		}
		if(pos == str.length() or lvl > 60){
			return;
		}


		if(str[pos] == 'a'){
			if(a == NULL){
				a = new trie;
			}

			a->find(str, pos + 1, bitm, lvl + 1);
		} else {
			if(b == NULL){
				b = new trie;
			}

			b->find(str, pos + 1, bitm, lvl + 1);
		}
	}
int main() {
	ios::sync_with_stdio(false);

	int n;
	cin >> n;
	finalbit = (1 << n) - 1;

	for(int i = 0; i < n; i++){
		string str;
		cin >> str;

		for(int j = 0; j < str.length(); j++){
			root.find(str, j, 1 << i);
		}
	}

	cout << res;
	return 0;
}