涉及知识点:
solution:
- 首先通过题面,我们可以很轻松的得到no的条件
- -一个字母有两个以上的字母和它相邻
- -成为一个环(这样的必定有一个字母和它的邻居不是相邻的)
- 然后我们讨论一下输出yes 的情况
- -我们发现只要用邻接链表把每个字母的邻居存起来
- -然后在用dfs输出就行
std:
#include <cstdio>
#include <algorithm>
#include<iomanip>
#include <iostream>
#include <cmath>
#include <string>
#include <vector>
#include <set>
#include <queue>
#include <cstring>
#include<stack>
#include <cassert>
#include<map>
using namespace std;
typedef long long LL;
LL n, k, m ;
LL i,j,g;
set<int> v[300];
bool st[100];
bool vis(int n ){
return n>2?false:true;
}
void dfs(int u , int fa ){
if(st[u]==0){
putchar(u);
st[u]=1 ;
}
for(auto &k : v[u]){
if(k==fa)continue;
dfs(k,u);
}
}
int main()
{
cin>>n;
while(n--){
string s;cin >>s;
int len = s.size();
if(len==1){
cout<<"YES"<<endl;
cout<<"bacdefghijklmnopqrstuvwxyz"<<endl;
continue ;
}
for(int i='a';i<='z';i++){
v[i].clear();
st[i] = 0;
}
for(int i=1;i<len;i++){
v[s[i]].insert(s[i-1]);
v[s[i-1]].insert(s[i]);
}
int cnt=0 ,pos =-1 , flag =1 ;
for(int i='a';i<='z';i++){
if(vis(v[i].size())==false){
flag =0 ;break;
}
if(v[i].size()==1) cnt ++,pos= i;
}
if(!flag || cnt !=2){
cout<<"NO"<<endl;
continue;
}
cout<<"YES"<<endl;
dfs(pos,-1);
for(int i='a';i<='z';i++)dfs(i, -1 );
cout<<endl;
}
return 0;
}