社区讨论
求助,WA第4个点
P1127词链参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mi7xis17
- 此快照首次捕获于
- 2025/11/21 05:14 4 个月前
- 此快照最后确认于
- 2025/11/21 05:14 4 个月前
RT
找不到错哪了
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 条回复,欢迎继续交流。
正在加载回复...