也用的是持久化trie+lca,为啥结果一个都不对?
查看原帖
也用的是持久化trie+lca,为啥结果一个都不对?
1077851
rmxsxhl楼主2024/3/7 19:59

样例通过了,但是结果一个都不对... 请问哪里错了呢?

#include <iostream>
#include <queue>
#include <string>
#include <map>
#include <cstring>
#include <deque>
#include <vector>
#include <unordered_map>
#include <set>
#include <algorithm>

using namespace std;

const int kSiz = 1e6 + 8;
const int kLog = 20;

struct Node {
    int nxt[26];
    int cnt;
};

int N, head = 1;

int dep[kSiz];
int fa[kSiz][kLog];
int root[kSiz];
Node tree[kSiz * 12];

int lca(int x, int y) {
    if (dep[x] < dep[y]) {
        swap(x, y);
    }
    for (int i = kLog - 1;i >= 0;i--) {
        if (dep[fa[x][i]] >= dep[y]) {
            x = fa[x][i];
        }
    }
    if (x == y) return x;
    for (int i = kLog - 1;i >= 0;i--) {
        if (dep[x] != dep[y]) {
            x = fa[x][i];
            y = fa[y][i];
        }
    }
    return fa[x][0];
}

void modify(int old, int now, const string& s) {
    tree[now] = tree[old];
    if (!s.empty()) {
        tree[now].cnt++;
    }

    for (int i = 0; s[i];++i) {
        int idx = s[i] - 'a';

        tree[now].nxt[idx] = head;
        int cld = tree[old].nxt[idx];
        tree[head] = tree[cld];
        tree[head].cnt++;

        old = cld;
        now = head;

        head++;
    }
}

vector < vector<pair<int, string> > > edge;
void dfs(int x, int p, const string& s) {
    dep[x] = dep[p] + 1;
    fa[x][0] = p;
    for (int i = 1;i < kLog;++i) {
        int t = fa[x][i - 1];
        fa[x][i] = fa[t][i - 1];
    }
    root[x] = head++;
    modify(root[p], root[x], s);

    for (auto& it : edge[x]) {
        if (it.first != p) {
            dfs(it.first, x, it.second);
        }
    }
}

int travel(int r, const string& s) {
    for (int i = 0; s[i];++i) {
        int idx = s[i] - 'a';
        r = tree[r].nxt[idx];
    }
    return tree[r].cnt;
}

void query(int x, int y, string& s) {
    int p = lca(x, y);

    int a = travel(root[x], s);
    int b = travel(root[y], s);
    int c = travel(root[p], s);
    cout << a + b - c * 2 << endl;
    // cout << a << " " << b << " " << c << endl;
}

bool vis[kSiz];
void ndfs(int p) {
    if (vis[p]) {
        return;
    }
    vis[p] = true;

    printf("\t%d [label = \"%d, %d\"]\n", p, p, tree[p].cnt);
    for (int i = 0; i < 26; ++i) {
        char s = ('a' + i);
        int n = tree[p].nxt[i];
        if (n) {
            printf("\t%d -> %d[label = \"%c\"]\n", p, n, s);
            ndfs(n);
        }
    }
}

void work() {
    cin >> N;
    edge.resize(N + 1);

    int a, b;
    string s;
    for (int i = 1;i < N;++i) {
        cin >> a >> b >> s;
        edge[a].push_back({ b, s });
        edge[b].push_back({ a, s });
    }

    s = "";
    dfs(1, 0, s);

    int Q;
    cin >> Q;
    for (int i = 0; i < Q;++i) {
        cin >> a >> b >> s;
        query(a, b, s);
    }

    // printf("digraph G {\n");
    // for (int i = 1; i <= N; ++i) {
    //     ndfs(root[i]);
    // }
    // printf("}\n");
}


int main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    work();

    return 0;
}

2024/3/7 19:59
加载中...