20分,WA,求大佬帮忙
查看原帖
20分,WA,求大佬帮忙
1408977
yuyang0974楼主2024/10/29 22:20

我的思路是用dfs来解决这个类似环状的问题 样例过了,类似banana、arr这些我造的也过了,但是不知道为什么baba过不了

#include <bits/stdc++.h>
using namespace std;
const int maxn = 10002;
int n, p, lev = 1;  //lev当前已经找到的原来字符转长度
char ans[maxn], End[maxn], beg[maxn]; //答案数组,结尾字母,开头字母
bool vis[maxn];
bool cmp (char e1, char e2) {
	return e1 < e2;
}
int cnt, head[27], nex[maxn], to[maxn]; //链式前向星
void init () {  //初始化
	for (int i = 0; i <= 26; i ++) head[i] = -1;
	cnt = 0;
}
void cin_ (int u, int v) {  //加边,即尾字母和首字母的对应关系
	to[++ cnt] = v;
	nex[cnt] = head[u];
	head[u] = cnt;
}
void dfs (int u) {
	int i = head[u];
	while (vis[i]) { //这条边访问过,就看下一条边
		i = nex[i];
		if (!(~i)) {
			ans[1] = ans[lev];
			ans[lev] = '\0'; //整理ans数组,准备输出
			return;
		}
	}
	ans[++ lev] = 'a' + to[i]; //答案累加
	vis[i] = true;
	dfs (int(to[i]));
}
int main () {
	init ();
	scanf ("%d%s%d", &n, End + 1, &p);
	for (int i = 1; i <= n + 1; i ++) beg[i] = End[i];
	sort (beg + 1, beg + n + 1, cmp); //输入和整理首字母数组和尾字母数组
	for (int i = 1; i <= n; i ++) {
		cin_ (End[i] - 'a', beg[i] - 'a');
	}
	vis[p] = true;  //标记第一条边
	ans[++ lev] = 'a' + to[p];
	dfs (int(ans[2] - 'a'));
	printf ("%s", ans + 1);
	return 0;
}
2024/10/29 22:20
加载中...