Submission #1272937

#TimeUsernameProblemLanguageResultExecution timeMemory
1272937GabitussPotemkin cycle (CEOI15_indcyc)C++20
0 / 100
66 ms5124 KiB
#include <bits/stdc++.h>

using namespace std;

//@formatter:off
using ll = long long;
template<typename T> istream &operator>>(istream &is, vector<T> &a);
template<typename T> ostream &operator<<(ostream &os, vector<T> &a);
//@formatter:on

struct Hash {
    int n;
    const int p = 237, mod = 1e9 + 21;
    vector<int> hash, pw;

    int sum(int a, int b) {
        if (a + b >= mod) return a + b - mod;
        else return a + b;
    }

    int sub(int a, int b) {
        if (a - b < 0)
            return a - b + mod;
        else
            return a - b;
    }

    int mul(int a, int b) {
        return 1ll * a * b % mod;
    }

    int get(int l, int r) {
        return sub(hash[r], mul(hash[l], pw[r - l]));
    }

    Hash(string s) {
        n = s.size();
        hash.resize(n + 1);
        pw.resize(n + 1);
        pw[0] = 1;
        for (int i = 0; i < n; ++i) {
            pw[i + 1] = mul(pw[i], p);
        }
        for (int i = 0; i < n; ++i) {
            hash[i + 1] = sum(mul(hash[i], p), s[i] % mod);
        }
    }
};

struct node {
    array<int, 26> nx;
    int suff, prev;
    ll cnt;

    node() {
        nx.fill(-1);
        suff = prev = -1;
        cnt = 0;
    }
};

struct Suff {
    int a = 0;
    vector<ll> cnt;
    vector<int> term;
    vector<node> S;

    Suff() {
        S.emplace_back();
        cnt.emplace_back();
        S[0].cnt = 1;
    }

    void add(int x) {
        int b = S.size();
        S.emplace_back();
        cnt.emplace_back();

        S[b].prev = a;
        S[b].suff = 0;

        for (; a != -1; a = S[a].suff) {
            if (S[a].nx[x] == -1) {
                S[a].nx[x] = b;
                S[b].cnt += S[a].cnt;
                continue;
            }

            int c = S[a].nx[x];
            if (S[c].prev == a) {
                S[b].suff = c;
                break;
            }

            int d = S.size();
            S.emplace_back();
            cnt.emplace_back();

            S[d].suff = S[c].suff;
            S[c].suff = S[b].suff = d;
            S[d].prev = a;

            S[d].nx = S[c].nx;
            for (; a != -1 && S[a].nx[x] == c; a = S[a].suff) {
                S[d].cnt += S[a].cnt;
                S[c].cnt -= S[a].cnt;
                S[a].nx[x] = d;
            }
            break;
        }

        a = b;
    }

    void init() {
        term.resize((int) S.size());
        int v = a;
        while (v != -1) {
            term[v] = true;
            v = S[v].suff;
        }
        dfs(0);
    }

    void dfs(int v) {
        cnt[v] = term[v];
        for (int i = 0; i < 26; i++) {
            if (S[v].nx[i] == -1) continue;
            if (cnt[S[v].nx[i]] == 0) dfs(S[v].nx[i]);

            cnt[v] += cnt[S[v].nx[i]];
        }
    }

    int move(string s) {
        int v = 0;
        for (auto ch: s) {
            if (S[v].nx[ch - 'a'] == -1) return -1;
            v = S[v].nx[ch - 'a'];
        }
        return v;
    }
};

signed main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#else
    ios_base::sync_with_stdio(false);
    cin.tie(0);
#endif

    int n, m;
    cin >> n >> m;

    vector<vector<int>> g(n);
    for (int i = 0; i < m; ++i) {
        int u, v;
        cin >> u >> v;

        g[u - 1].push_back(v - 1);
        g[v - 1].push_back(u - 1);
    }

    vector<int> ord(n);
    std::iota(ord.begin(), ord.end(), 0);
    std::sort(ord.begin(), ord.end(), [&](int i, int j) {
        return g[i].size() > g[j].size();
    });
    for (int v = 0; v < n; ++v) {
        std::sort(g[v].begin(), g[v].end(), [&](int i, int j) {
            return g[i].size() < g[j].size();
        });
        while (!g[v].empty() && g[v].size() < g[g[v].back()].size()) {
            g[v].pop_back();
        }
    }

    vector<int> used(n);
    for (int u = 0; u < n; ++u) {
        int cntl = 0;
        for (auto v: g[u]) {
            cntl++;
            used[v] = true;
        }
        for (auto v: g[u]) {
            int cntr = 0;
            cntl--;
            for (auto v2: g[v]){
                if (used[v2]){
                    cntl--;
                } else {
                    cntr++;
                }
            }

            if (cntl && cntr){
                for (auto v2: g[v]){
                    used[v2] ^= 1;
                }
                for (auto v2: g[u]){
                    if (used[v2]){
                        cout << v2 + 1 << " ";
                        break;
                    }
                }
                for (auto v2: g[v]){
                    used[v2] ^= 1;
                }
                cout << u + 1 << " " << v + 1 << " ";
                for (auto v2: g[v]){
                    if (used[v2] == 0){
                        cout << v2 + 1 << "\n";
                        break;
                    }
                }
                return 0;
            }

            for (auto v2: g[v]){
                if (used[v2]){
                    cntl++;
                } else {
                    cntr--;
                }
            }
            cntl++;
        }
        for (auto v: g[u]) {
            cntl++;
            used[v] = false;
        }
    }
    cout << "no" << "\n";
}

// region POZOR
template<typename T>
ostream &operator<<(ostream &os, vector<T> &a) {
    for (int i = 0; i < a.size(); i++)
        os << a[i] << " \n"[i == a.size() - 1];
    return os;
}

template<typename T>
istream &operator>>(istream &is, vector<T> &a) {
    for (auto &i: a)
        is >> i;
    return is;
}
// endregion
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...