#include <bits/stdc++.h>
using namespace std;
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    vector<string> b(n);
    for (string &s : b) cin >> s;
    vector<string> a;
    for (int i = 0; i < n; i++) {
        int p;
        cin >> p;
        a.push_back(b[--p]);
    }
    vector<vector<int>> adj(26);
    function<void(int, int, int)> solve = [&](int l, int r, int p) {
        if (l >= r) return;
        string s = "";
        for (int i = l; i <= r; i++) {
            if (p >= a[i].size()) {
                s += ' ';
            }
            else {
                s += a[i][p];
            }
        }
        for (int i = 1; i < s.size(); i++) {
            if (s[i] == ' ' && s[i - 1] != ' ') {
                cout << "NE\n";
                exit(0);
            }
            if (s[i] != s[i - 1] && s[i - 1] != ' ') {
                adj[s[i - 1] - 'a'].push_back(s[i] - 'a');
            }
        }
        while (l <= r && p >= a[l].size()) l++;
        int k = l;
        for (int i = l + 1; i <= r; i++) {
            if (a[i][p] != a[i - 1][p]) {
                solve(k, i - 1, p + 1);
                k = i;
            }
        }
        solve(k, r, p + 1);
    };
    solve(0, n - 1, 0);
    vector<int> topo, vis(26);
    function<void(int)> dfs =  [&](int u) {
        vis[u] = 1;
        for (int v : adj[u]) {
            if (!vis[v]) dfs(v);
            else if (vis[v] == 1) {
                cout << "NE\n";
                exit(0);
            }
        }
        topo.push_back(u);
        vis[u] = 2;
    };
    for (int i = 0; i < 26; i++) {
        if (!vis[i] && adj[i].size()) dfs(i);
    }
    reverse(topo.begin(), topo.end());
    cout << "DA\n";
    string ans(26, ' ');
    for (int i = 0; i < topo.size(); i++) {
        ans[topo[i]] = i + 'a';
    }
    for (char c = topo.size() + 'a'; c <= 'z'; c++) {
        for (char &ch : ans) {
            if (ch == ' ') {
                ch = c;
                break;
            }
        }
    }
    cout << ans << '\n';;
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |