欧拉路 WA 46pts 求调&求 Hack
  • 板块P1127 词链
  • 楼主oddy
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/1/30 09:38
  • 上次更新2023/10/28 21:16:00
查看原帖
欧拉路 WA 46pts 求调&求 Hack
470348
oddy楼主2023/1/30 09:38

如题,WA #2、#6 ~ #10,其余 AC。

解题思路:字母为点,对于每个单词,令其首字母向尾字母连边,然后跑欧拉路。

代码如下:

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

int n, c, S, d[1005], del[1005], ans[1005];
char s[1005][25];
struct edge {
    int v, i;
    bool operator <(const edge &x) const {
        return v != x.v ? v < x.v : strcmp(s[i], s[x.i]) < 0;
    }
};
std::vector<edge> e[30];

void dfs(int u) {
    for(int i = del[u]; i < e[u].size(); i = del[u])
        del[u] = i + 1, dfs(e[u][i].v), ans[++c] = e[u][i].i;
}

int main() {
    scanf("%d", &n);
    for(int i = 0, u, v; i < n; i++)
        scanf("%s", s[i]), u = *s[i]-'a', v = s[i][strlen(s[i])-1]-'a',
        e[u].emplace_back(edge{v, i}), d[u]++, d[v]--;

    for(int i = 25; i >= 0; i--) {
        std::sort(e[i].begin(), e[i].end());
        if(d[i] == 1) S = i;
    }

    dfs(S);
    if(c != n) puts("***");
    else {
        for(; c > 1; c--) printf("%s.", s[ans[c]]);
        puts(s[ans[1]]);
    }

    return 0;
}
2023/1/30 09:38
加载中...