构造题,根据给出字母顺序建图,然后拓扑就好了,注意判断-1的情况。空行处理一下。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
vector<int> v[30], mp[N], ans;
int num[N], in[N], tot, n, m, t, d[30];
string s, tmp;
int main() {
cin >> n >> m;
m = m * (m - 1) / 2;
while(m--) {
cin >> s >> t;
if(t)
cin >> tmp;
else
getchar();
memset(d, 0, sizeof d);
int f = -1;
for(int i = 0; i < t; i++) {
int id = tmp[i] - 'a';
d[id]++;
if(v[id].size() < d[id]) {
v[id].push_back(++tot);
num[tot] = id;
}
if(f != -1) {
mp[f].push_back(v[id][d[id] - 1]);
in[v[id][d[id] - 1]]++;
}
f = v[id][d[id] - 1];
}
}
queue<int> q;
for(int i = 1; i <= tot; i++)
if(!in[i])
q.push(i);
while(!q.empty()) {
int u = q.front();
ans.push_back(u);
q.pop();
for(int i = 0; i < mp[u].size(); i++) {
in[mp[u][i]]--;
if(!in[mp[u][i]])
q.push(mp[u][i]);
}
}
if(ans.size() != n)
cout << -1;
else
for(int i = 0; i < ans.size(); i++)
cout << (char)(num[ans[i]] + 'a');
return 0;
}