社区讨论

求助,WA第4个点

P1127词链参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mi7xis17
此快照首次捕获于
2025/11/21 05:14
4 个月前
此快照最后确认于
2025/11/21 05:14
4 个月前
查看原帖
RT
找不到错哪了QωQQ\omega Q
CPP
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1010;
const int M = N << 1;
const int K = 27;
struct str {
    char c[K];
    int L;
};
str a[N];
int di[M], ne[M], fi[N], ans[N], ru[K], chu[K], k, l, s, n;
bool v[N], e[K];
inline void re_l(int i)//输入
{
    char c = getchar();
    for (; c < 'a' || c > 'z'; c = getchar());
    for (; c >= 'a' && c <= 'z'; c = getchar())
        a[i].c[a[i].L++] = c;
}
inline int minn(int x, int y) { return x < y ? x : y; }
bool comp(str x, str y)//sort的比较函数,按字典序排序字符串
{
    int i, k = minn(x.L, y.L);
    for (i = 0; i < k; i++)
        if (x.c[i] ^ y.c[i])
            return x.c[i] < y.c[i];
    return x.L < y.L;
}
inline void add(int x, int y) { di[++l] = y; ne[l] = fi[x]; fi[x] = l; }//加边
inline int chg(char c) { return c - 'a' + 1; }//字符转换为数字
inline int jd(int x) { return x < 0 ? -x : x; }//绝对值
void dfs_1(int x)//判断所有点是否在同一连通块
{
    s++; v[x] = 1;
    int i, y;
    for (i = fi[x]; i; i = ne[i])
        if (!v[y = di[i]])
            dfs_1(y);
}
void dfs_2(int x)//递归求解
{
    for (int i = 1; i <= n; i++)
        if (chg(a[i].c[0]) == x && !v[i])
            v[i] = 1, dfs_2(chg(a[i].c[a[i].L - 1])), ans[++k] = i;
}
int main()
{
    int i, j = 0, x, y, o = K;
    scanf("%d", &n);
    for (i = 1; i <= n; i++)
        re_l(i);
    sort(a + 1, a + n + 1, comp);
    for (i = 1; i <= n; i++)
    {
        ru[y = chg(a[i].c[a[i].L - 1])]++; chu[x = chg(a[i].c[0])]++;//入度出度+1
        add(x, y); add(y, x);
        o = minn(o, minn(x, y));//记录所有点里字典序最小的那个
        if (!e[x])//记录出现点的种类
            e[x] = 1, j++;
        if (!e[y])
            e[y] = 1, j++;
    }
    dfs_1(1);
    if (s ^ j)//如果不是全在同一连通块则判无解
        return printf("***"), 0;
    for (s = 0, i = 1; i < K; i++)//判断是否是欧拉路或欧拉回路
    {
        if (jd(ru[i] - chu[i]) > 1)
            return printf("***"), 0;
        if (jd(ru[i] - chu[i]) == 1)
            s++;
        if (chu[i] - ru[i] == 1)//欧拉路的起点
            x = i;
    }
    if (s && s ^ 2)
        return printf("***"), 0;
    memset(v, 0, sizeof(v));
    s ^ 2 ? dfs_2(o) : dfs_2(x);//如果是欧拉回路,那么从最小的那个点进行求解,否则按之前存的起点开始
    for (i = k; i; i--)//倒序输出答案
    {
        for (j = 0; j < a[ans[i]].L; j++)
            putchar(a[ans[i]].c[j]);
        if (i ^ 1)
            putchar('.');
    }
    return 0;
}

回复

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

正在加载回复...