萌新求助简单 trie 题

P4683 [IOI2008] Type Printer

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] 语句不应该返回。

此贴终结。


|