大意给定一些序列a-z,问你能把他们全部连在一起,并输出最短的最终序列。
思路:类似与拓扑排序,并且只有26个字母所以爆搜就行,存储序列可以用vector存储,记录入度并标记出现的字母最后再标记已经存储的字母即可。
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
#include<stack>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
#define inf 0x3f3f3f3f
#define eps 1e-8
#include<vector>
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
const double PI=acos(-1.0);
using namespace std;
char str[110][110],tmp[110];
vector<int>q[30];
int node[110],cnt;bool vis[110],bj[110];
void DFS(int u){
bj[u] = true;tmp[cnt++]=u+'a';
for(int i = 0;i < q[u].size();++ i){
int v = q[u][i];
if(!bj[v])
DFS(v);
}
//cout<<"**"<<endl;
}
int main(){
int n,m,i,j,k;
while(~scanf("%d",&n)){
cnt=0;
for(i = 0;i < 30;++ i){
q[i].clear();
node[i] = 0;vis[i] = bj[i] = false;
}
for(i = 0;i < n;++ i){
scanf("%s",str[i]);
int l = strlen(str[i]);
for(j = 0;j < l;++ j){
if(j != l-1){
q[str[i][j]-'a'].push_back(str[i][j+1]-'a');
node[str[i][j+1]-'a']++;
}
vis[str[i][j]-'a'] = true;
}
}
for(i = 0;i < 30 ;++i){
if(!node[i]&&vis[i]){
DFS(i);
}
}
tmp[cnt]='\0';
printf("%s\n",tmp);
}
return 0;
}