题目链接:Codeforces 638B Making Genome in Berland
题意:给定 n 个不存在相同字母的子串,让你找到一个最短的串包含所有子串。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <stack>
#define PI acos(-1.0)
#define CLR(a, b) memset(a, (b), sizeof(a))
#define fi first
#define se second
#define ll o<<1
#define rr o<<1|1
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;
const int MAXN = 2*1e5 + 1;
const int pN = 1e6;// <= 10^7
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
void add(LL &x, LL y) { x += y; x %= MOD; }
vector<int> next[30];
bool vis[30], mark[30];
string res = "";
int in[30];
void DFS(int u) {
vis[u] = true; res += u + 'a';
for(int i = 0; i < next[u].size(); i++) {
int v = next[u][i];
if(in[v] != 0 && vis[v] == false) {
DFS(v);
}
}
}
int main()
{
int n; cin >> n; string a;
for(int i = 0; i < n; i++) {
cin >> a;
for(int j = 0; j < a.size(); j++) {
if(j != a.size() - 1) {
next[a[j]-'a'].push_back(a[j+1]-'a');
in[a[j+1]-'a']++;
}
mark[a[j]-'a'] = true;
}
}
for(int i = 0; i < 26; i++) {
if(in[i] == 0 && mark[i]) {
DFS(i);
}
}
cout << res << endl;
return 0;
}