[CF1303C] Perfect Keyboard - DFS

Solution

根据原字符串建图,每个字符是一个点,相邻则连边

然后从每一个度数为 \(1\) 的点开始爆搜连通块,合法情况下应该是一条链


#include <bits/stdc++.h>
using namespace std;

#define int long long

int g[33][33],d[33],vis[33],fg=1;
vector <int> sta;

void dfs(int p) {
    if(vis[p]) return;
    vis[p]=1;
    sta.push_back(p);
    int flag=1;
    for(int i=0;i<26;i++) {
        if(vis[i]==0 && g[p][i]) {
            if(flag) {
                flag=0;
                dfs(i);
            }
            else {
                fg=0;
            }
        }
    }
}

void solve(string str) {
    sta.clear();
    fg=1;
    memset(g,0,sizeof g);
    for(int i=1;i<str.size();i++) {
        g[str[i]-'a'][str[i-1]-'a']=1;
        g[str[i-1]-'a'][str[i]-'a']=1;
    }
    memset(d,0,sizeof d);
    for(int i=0;i<26;i++) {
        for(int j=0;j<26;j++) d[i]+=g[i][j];
    }
    memset(vis,0,sizeof vis);
    for(int i=0;i<26;i++) {
        if(d[i]<=1 && vis[i]==0) {
            dfs(i);
        }
    }
    if(sta.size()!=26) fg=0;
    for(int i=0;i<26;i++) if(d[i]>2) fg=0;
    if(fg) {
        puts("YES");
        for(int i=0;i<26;i++) cout<<(char)(sta[i]+'a');
        cout<<endl;
    }
    else {
        puts("NO");
    }
}

signed main() {
    int t;
    cin>>t;
    while(t--) {
        string str;
        cin>>str;
        solve(str);
    }
}

猜你喜欢

转载自www.cnblogs.com/mollnn/p/12345834.html