社区讨论

欧拉回路板子题 萌新刚学oi调不出来。_。

P1127词链参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo8sz7um
此快照首次捕获于
2023/10/28 00:03
2 年前
此快照最后确认于
2023/10/28 00:03
2 年前
查看原帖
原谅我烂到不行的码风qwq
CPP
// #include <bits/stdc++.h>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cmath>
#include <string>
#include <cstdio>
#include <iomanip>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

inline int read() {
    int res = 0, F = 1;
    char k;
    while (!isdigit(k = getchar())) if (k == '-') F = -1;
    while (isdigit(k)) {
        res = res * 10 + k - '0';
        k = getchar();
    }
    return res * F;
}

struct node {
    int v;
    string w;
};

int n, cnt, in[1005], out[1005], f[1005], disapp[300];
string a[1005];
vector <node> g[300];
bool vis[300][1005];

bool chk(string a, string b) {
    return a < b;
}

string dfs(int u, string s) {
    if (s.length() == cnt) return s;
    int l = g[u].size();

    string q = "";
    for (int i = 0; i < l; i++) {
        if (vis[u][i] == 1) continue ;

        int v = g[u][i].v;
        string w = g[u][i].w, res = "";

        if (s == "") res = g[u][i].w;
        else res = s + "." + g[u][i].w;

        vis[u][i] = 1;
        string qwq = dfs(v, res);
        if (chk(q, qwq)) q = qwq;
        vis[u][i] = 0;
    }

    return q;
}

int find(int x) {
    if (f[x] == x) return x;
    else return f[x] = find(f[x]);
}

int main() {
    // freopen("test.in", "r", stdin);
    // freopen("test1.out","w", stdout);
    cin >> n;

    for (int i = int('a'); i <= int('z'); i++) f[i] = i;

    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        g[int(a[i][0])].push_back((node){int(a[i][a[i].length() - 1]), a[i]});
        cnt = cnt + a[i].length() + 1;

        out[int(a[i][0])]++; in[int(a[i][a[i].length() - 1])]++;
        f[find(int(a[i][a[i].length() - 1]))] = f[find(int(a[i][0]))];
        disapp[int(a[i][0])] = 1; disapp[int(a[i][a[i].length() - 1])] = 1;
    } cnt--;

    if (n == 1) {
        cout << a[1] << endl;
        return 0;
    }

    int ss = 0, st = 0; bool tmp = 0;
    for (int i = int('a'); i <= int('z'); i++) {
        if (!disapp[i]) continue ;
        if (find(i) != find(a[1][0])) {
            cout << "***" << endl;
            return 0;
        }

        if (out[i] == in[i] + 1) {
            if (ss == 0) ss = i;
            else {
                cout << "***" << endl;
                return 0;
            }
        } else if (out[i] + 1 == in[i]) {
            if (st == 0) st = i;
            else {
                cout << "***" << endl;
                return 0;
            }
        } else if (in[i] != out[i]) {
            cout << "***" << endl;
            return 0;
        }
    }

    if (ss == 0 && st == 0) {
        ss = a[1][0]; st = a[1][0];
    }
    if ((ss == 0 && st != 0) || (ss != 0 && st == 0)) {
        cout << "***" << endl;
        return 0;
    }

    string ans = dfs(ss, "");

    if (ans == "") cout << "***" << endl;
    else cout << ans << endl;

    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...