Link_Cut_Y @ 2023-07-19 16:38:23
球球了,真的不知道错在哪里了。
目前 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;
}
by Link_Cut_Y @ 2023-07-19 17:06:17
找到锅了。在 dfs
函数里 ed[u]
语句不应该返回。
此贴终结。