7.22每日一题题解

Perfect Keyboard

涉及知识点:

  • 深搜
  • 贪心
  • 思维

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;

}

posted @ 2020-07-21 19:14  QFNU-ACM  阅读(93)  评论(0编辑  收藏  举报