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; }