void generate(string s, int val) { queue<string> q; int i, h, pai, filho; if(m.count(s) == 0) { m[s] = m.size() - 1; q.push(s); } pai = m[s]; tam[pai] = val; while(!q.empty()) { s = q.front(); pai = m[s]; q.pop(); if(tam[pai] > resp) continue; query.clear(); t.match(s, 0); for(i=0;i<query.size();i++) { if(!sufix(s, query[i])) continue; if(m.count(sufstr) == 0) { m[sufstr] = m.size() - 1; filho = m.size() - 1; q.push(sufstr); } else filho = m[sufstr]; tam[filho] = tam[pai] + sufdis; grafo[pai].push_back(filho); peso[pai].push_back(sufdis); } } }
int main() { int N, i, j, k; vector<string> init; vector<int> start; string str; char s[100]; while(scanf("%d", &N) != EOF && N) { v.clear(); init.clear(); start.clear(); t.children.clear(); for(i=0;i<m.size();i++) { grafo[i].clear(); peso[i].clear(); tam[i] = INF; } m.clear(); m[""] = 0; for(i=0;i<N;i++) { scanf("%s", s); t.insert(s, 0); v.push_back(s); } for(i=0;i<v.size();i++) { query.clear(); t.match(v[i], 0); for(j=0;j<query.size();j++) if(query[j] != v[i]) { if(!sufix(v[i], query[j])) continue; init.push_back(sufstr); start.push_back(max(v[i].size(), query[j].size())); } } resp = INF; for(i=0;i<init.size();i++) if(start[i] < resp) resp = min(resp, shortest_path(init[i], start[i])); if(resp == INF) printf("-1\n"); else printf("%d\n", resp); } return 0; }