// implement 15min #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull; static const double EPS = 1e-9; static const double PI = acos(-1.0); #define REP(i, n) for (int i = 0; i < (int)(n); i++) #define FOR(i, s, n) for (int i = (s); i < (int)(n); i++) #define FOREQ(i, s, n) for (int i = (s); i <= (int)(n); i++) #define FORIT(it, c) for (__typeof((c).begin())it = (c).begin(); it != (c).end(); it++) #define MEMSET(v, h) memset((v), h, sizeof(v)) typedef int Weight; struct Edge { int src; int dest; Weight weight; Edge(int src, int dest, Weight weight) : src(src), dest(dest), weight(weight) {;} bool operator<(const Edge &rhs) const { if (weight != rhs.weight) { return weight > rhs.weight; } if (src != rhs.src) { return src < rhs.src; } return dest < rhs.dest; } }; typedef vector Edges; typedef vector Graph; typedef vector Array; typedef vector Matrix; void PrintMatrix(const Matrix &matrix) { for (int y = 0; y < (int)matrix.size(); y++) { for (int x = 0; x < (int)matrix[y].size(); x++) { printf("%d ", matrix[y][x]); } puts(""); } } void SccDfs(const Graph &g, int from, vector &visit, vector &st) { visit[from] = 1; for (Edges::const_iterator it = g[from].begin(); it != g[from].end(); it++) { if (visit[it->dest]) { continue; } SccDfs(g, it->dest, visit, st); } st.push_back(from); } vector > Scc(const Graph &g) { const int n = g.size(); vector > ret; Graph revg(n); for (int i = 0; i < n; i++) { for (Edges::const_iterator it = g[i].begin(); it != g[i].end(); it++) { revg[it->dest].push_back(Edge(it->dest, i, it->weight)); } } vector st; vector visit(n, 0); for (int i = 0; i < n; i++) { if (visit[i]) { continue; } SccDfs(g, i, visit, st); } visit = vector(n, 0); for (int i = n - 1; i >= 0; i--) { int index = st[i]; if (visit[index]) { continue; } vector nret; SccDfs(revg, index, visit, nret); ret.push_back(nret); } return ret; } int n; char strs[10010][20]; Graph g; void CreateGraph(int depth, int start, int end) { if (end - start <= 1) { return; } int pstart = start; int prev = strs[start][depth]; FOR(i, start, end) { int c = strs[i][depth]; if (prev != c) { g[prev].push_back(Edge(prev, c, 0)); CreateGraph(depth + 1, pstart, i); pstart = i; prev = c; } } if (prev != '\0') { CreateGraph(depth + 1, pstart, end); } } int main() { while (scanf("%d", &n) > 0 && n) { g = Graph(300); FOR(i, 1, 300) { g[0].push_back(Edge(0, i, 0)); } REP(i, n) { scanf("%s", strs[i]); } CreateGraph(0, 0, n); vector > group = Scc(g); if ((int)group.size() == (int)g.size()) { puts("yes"); } else { puts("no"); } } }