萌新求助简单 trie 题
查看原帖
萌新求助简单 trie 题
519384
Link_Cut_Y楼主2023/7/19 16:38

球球了,真的不知道错在哪里了。

目前 assert 了一下,应该是 dfs 的锅。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cassert>

using namespace std;

const int N = 100010 * 21;
int hs[N], ch[N][26], n, ls, idx, ans;
bool ed[N];
string S;

void insert(string s) {
	int u = 0;
	for (auto i : s) {
		int v = i - 'a';
		if (!ch[u][v]) ch[u][v] = ++ idx;
		u = ch[u][v];
	} ed[u] = true;
}
void mark(string s) {
	int u = 0;
	for (auto i : s) {
		int v = i - 'a';
		hs[u] = v; u = ch[u][v];
	}
}
void dfs(int u) {
	if (ed[u]) { puts("P"); ans ++ ; return; }
	for (int i = 0; i < 26; i ++ ) {
		if (!ch[u][i]) continue;
		if (i == hs[u]) continue;
		putchar(i + 'a'), putchar('\n'); ans ++ ;
		dfs(ch[u][i]);
		putchar('-'), putchar('\n'); ans ++ ;
	}
	if (~hs[u]) {
		putchar(hs[u] + 'a'); putchar('\n'); ans ++ ;
		dfs(ch[u][hs[u]]);
	}
}
int main() {
	memset(hs, -1, sizeof hs);
	scanf("%d", &n);
	for (int i = 1; i <= n; i ++ ) {
		string s;
		cin >> s; insert(s);
		if (s.size() > ls)
			ls = s.size(),
			S = s;
	}
	printf("%d\n", idx * 2 - ls + n);
	mark(S); dfs(0);
	assert(ans == idx * 2 - ls + n);
	return 0;
}
2023/7/19 16:38
加载中...