/* -*- coding: utf-8 -*- * * 3626.cc: No.3626 Not a Prefix - yukicoder */ #include #include using namespace std; /* constant */ const int MAX_N = 200000; const int MAX_GN = 500000; const int INF = 1 << 30; /* typedef */ struct Node { int p, c, f, nbrs[26]; Node(): p(), c(), f(), nbrs() {} void init(int _p = -1) { p = _p, c = f = 0; fill(nbrs, nbrs + 26, -1); } }; /* global variables */ char s[MAX_GN + 4]; Node es[MAX_GN]; int cis[MAX_GN], mincs[MAX_GN]; /* subroutines */ int allocnode(int &gn, int p = -1) { es[gn].init(p); return gn++; } void trie_add(char s[], int &gn) { int u = 0; for (int i = 0; s[i]; i++) { int ci = s[i] - 'a'; int &v = es[u].nbrs[ci]; if (v < 0) v = allocnode(gn, u); es[v].c++; u = v; } es[u].f++; } /* main */ int main() { int n, m; scanf("%d%d", &n, &m); int gn = 0; allocnode(gn); for (int i = 0; i < n; i++) { scanf("%s", s); trie_add(s, gn); } fill(mincs, mincs + gn, INF); for (int u = 0; u >= 0;) { auto &nbru = es[u].nbrs; int up = es[u].p; if (cis[u] < 26) { int v = nbru[cis[u]++]; if (v >= 0) u = v; } else { mincs[u] = min(mincs[u], es[u].c); if (up >= 0) mincs[up] = min(mincs[up], mincs[u]); u = up; } } int l = 0, d = n - m; for (int u = 0;;) { auto &nbru = es[u].nbrs; bool cont = false, f = false; for (int i = 0; i < 26; i++) { int v = nbru[i]; if (v < 0 || (es[v].f <= d && mincs[v] <= d)) { s[l++] = 'a' + i; cont = true; if (es[v].c <= d) f = true; u = v; break; } } if (! cont || f) break; } s[l] = '\0'; if (l > 0) printf("Yes\n%s\n", s); else puts("No"); return 0; }