7.22每日一題題解
阿新 • • 發佈:2020-07-21
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; }