#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;
int n;
string v[105], final[105];
int order[105], viz[50], outdegree[50];
set <int> vec[50], ivec[50];
vector <int> rnk;
int main ()
{
    cin >> n;
    int mxlen=0;
    for (int i=1;i<=n;i++)
    {
        cin >> v[i];
        mxlen=max (mxlen, (int)v[i].size());
    }
    for (int i=1;i<=n;i++)
    {
        cin >> order[i];
    }
    for (int i=1;i<=n;i++)
    {
        final[order[i]]=v[i];
    }
    for (int i=1;i<n;i++)
    {
        for (int j=i+1;j<=i+1;j++)
        {
            bool ok=0;
            for (int ind=0;ind<min (final[i].size(), final[j].size());ind++)
            {
                if (final[i][ind]!=final[j][ind])
                {
                    ok=1;
                    vec[final[i][ind]-'a'+1].insert (final[j][ind]-'a'+1);
                    ivec[final[j][ind]-'a'+1].insert (final[i][ind]-'a'+1);
                    outdegree[final[i][ind]-'a'+1]++;
                    break;
                }
            }
            if (!ok && final[j].size()<final[i].size())
            {
                cout << "NE";
                return 0;
            }
        }
    }
    queue <int> coada;
    for (int i=1;i<=26;i++)
    {
        if (outdegree[i]==0)
        {
            coada.push (i);
            viz[i]=1;
        }
    }
    while (!coada.empty())
    {
        int x=coada.front();
        rnk.push_back (x);
        coada.pop ();
        for (auto chestie : ivec[x])
        {
            outdegree[chestie]--;
            if (outdegree[chestie]==0 && !viz[chestie])
            {
                viz[chestie]=1;
                coada.push (chestie);
            }
        }
    }
    if (rnk.size()<26)
    {
        cout << "NE";
        return 0;
    }
    cout << "DA\n";
    string ans;
    ans.resize (26);
    int cnt=0;
    reverse (rnk.begin(), rnk.end());
    for (auto chestie : rnk)
    {
        cout << char (chestie+'a'-1);
    }
    cout << ans;
    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... |