QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#546333#8874. Labelled Pathszezoo050WA 2ms7584kbC++204.0kb2024-09-03 23:23:492024-09-03 23:23:49

Judging History

This is the latest submission verdict.

  • [2024-09-03 23:23:49]
  • Judged
  • Verdict: WA
  • Time: 2ms
  • Memory: 7584kb
  • [2024-09-03 23:23:49]
  • Submitted

answer

#include<bits/stdc++.h>


using namespace std;
const int N = 1e6 + 5, LG = 21;
vector<int> c[LG];

void SA(string &s) {
    s += '$';
    int n = (int) s.size();
    vector<int> p(n);
    p.resize(n);
    auto sort_ = [&](int k) {
        vector<int> cnt(n);
        for (int x: c[k]) {
            cnt[x]++;
        }
        vector<int> p_new(n), pos(n);
        pos[0] = 0;
        for (int i = 1; i < n; i++) {
            pos[i] = pos[i - 1] + cnt[i - 1];
        }
        for (int x: p) {
            p_new[pos[c[k][x]]] = x;
            pos[c[k][x]]++;
        }
        p.swap(p_new);
    };

    vector<pair<char, int>> a(n);

    for (int i = 0; i < n; i++) {
        a[i] = {s[i], i};
    }

    sort(a.begin(), a.end());

    for (int i = 0; i < n; i++) {
        p[i] = a[i].second;
    }
    c[0].resize(n);
    c[0][p[0]] = 0;
    for (int i = 1; i < n; i++) {
        c[0][p[i]] = c[0][p[i - 1]] + (a[i].first != a[i - 1].first);
    }
    for (int k = 0; (1 << k) < n; k++) {
        for (int i = 0; i < n; i++) {
            p[i] = (p[i] - (1 << k) + n) % n;
        }
        sort_(k);
        vector<int> c_new(n);
        c_new[p[0]] = 0;
        for (int i = 1; i < n; i++) {
            pair<int, int> pr = {c[k][p[i - 1]], c[k][(p[i - 1] + (1 << k)) % n]};
            pair<int, int> cur = {c[k][p[i]], c[k][(p[i] + (1 << k)) % n]};
            c_new[p[i]] = c_new[p[i - 1]] + (pr != cur);
        }
        c[k + 1] = c_new;

    }
    s.pop_back();
}

int lg[N];
int sz;

int comp(int i, int j, int l) {
    int k = lg[l];
    pair<int, int> a = {c[k][i], c[k][i + l - 1 - (1 << k)]};
    pair<int, int> b = {c[k][j], c[k][j + l - 1 - (1 << k)]};
    return (a == b ? 0 : a < b ? -1 : 1);
}

pair<int, int> mat[605][605];

bool comp(vector<int> v1, vector<int> &v2, int to) {
    v1.push_back(to);
    int p1 = 1, p2 = 1;
    auto[l1, len1] = mat[v1[p1 - 1]][v1[p1]];
    auto[l2, len2] = mat[v2[p2 - 1]][v2[p2]];
    while (p1 < v1.size() && p2 < v2.size()) {
        int len = min(len1, len2);
        int ret = comp(l1, l2, len);
        if (ret != 0)
            return ret == -1;
        if (len1 < len2) {
            p1++;
            if (p1 == v1.size())break;
            tie(l1, len1) = mat[v1[p1 - 1]][v1[p1]];
            l2 += len;
        } else if (len1 > len2) {
            p2++;
            if (p2 == v2.size())break;
            tie(l2, len2) = mat[v2[p2 - 1]][v2[p2]];
            l1 += len;
        } else {
            p1++, p2++;
            if (p2 == v2.size() || p1 == v1.size())break;
            tie(l1, len1) = mat[v1[p1 - 1]][v1[p1]];
            tie(l2, len2) = mat[v2[p2 - 1]][v2[p2]];
        }
    }
    if (p2 < v2.size())
        return 0;
    return 1;
}

void solve() {
    int st, n, m;
    string s;
    cin >> n >> m >> sz >> st >> s;
    --st;

    vector<int> cnt(n);
    vector<vector<array<int, 3>>> adj(n);
    for (int i = 0; i < m; i++) {
        int u, v;
        int l, len;
        cin >> u >> v >> l >> len;
        --u, --v, --l;
        adj[u].push_back({v, l, len});
        mat[u][v] = {l, len};
        cnt[v]++;
    }
    SA(s);

    vector<vector<int>> ans(n);
    function<void(int)> dfs = [&](int node) {
        ans[node].push_back(node);
        for (auto[to, _, __]: adj[node]) {
            if (ans[to].empty() || comp(ans[node], ans[to], to)) {
                ans[to] = ans[node];
            }
            cnt[to]--;
            if (!cnt[to])
                dfs(to);
        }
    };


    dfs(st);

    for (int i = 0; i < n; i++) {
        cout << ans[i].size() << ' ';
        for (auto j: ans[i])
            cout << j + 1 << ' ';
        cout << '\n';
    }
}

int32_t main() {
    for (int i = 2; i < N; i++) {
        lg[i] = lg[i / 2] + 1;
    }
    std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);
    int t = 1;

//    cin >> t;

    while (t--) {
        solve();
    }

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 2ms
memory: 7584kb

input:

11 30 105 9
fufuffuffuuuuuufuffuffuufffuufufuuuuuuuuuufffufufffuuufuffufufuuffffuufffuffffuffffufuuuufuufuuffuuuufffu
1 6 51 1
5 2 6 1
9 6 57 3
11 8 86 4
10 8 95 0
6 2 17 0
6 3 78 0
7 3 50 0
11 4 98 3
10 3 77 3
5 4 18 4
7 4 81 1
9 7 82 0
1 3 79 2
7 5 13 4
1 10 86 2
10 4 10 0
9 3 4 0
6 11 10 4
6 4 82...

output:

2 9 1 
7 9 7 5 6 3 8 2 
5 9 7 5 6 3 
5 9 7 5 6 4 
3 9 7 5 
4 9 7 5 6 
2 9 7 
6 9 7 5 6 3 8 
1 9 
3 9 1 10 
5 9 7 5 6 11 

result:

wrong answer wrong solution for vertex 2