1 条题解

  • 0
    @ 2025-10-22 16:46:09

    题解

    (请在此补充题目的中文题解与思路描述。)

    #include <bits/stdc++.h>
    
    using namespace std;
    using ll = long long;
    using tpl = tuple<int, int, int, int>;
    
    const int N = 1e5 + 10;
    
    int n, d, m, tp[N];
    int dfn[N], low[N], stk[N], top, tot, cnt, scc[N];
    bool f[N];
    string s;
    vector<int> pos, g[N];
    vector<tpl> rule;
    
    void tarjan(int u) {
        dfn[u] = low[u] = ++tot;
        stk[++top] = u, f[u] = 1;
        for (int v : g[u]) {
            if (!dfn[v]) tarjan(v), low[u] = min(low[u], low[v]);
            else if (f[v]) low[u] = min(low[u], dfn[v]);
        }
        if (dfn[u] == low[u]) {
            cnt++;
            while (1) {
                int k = stk[top--];
                scc[k] = cnt, f[k] = 0;
                if (u == k) break;
            }
        }
    }
    
    void Clear() {
        tot = cnt = top = 0;
        for (int i = 1; i <= 2 * n; i++) {
            dfn[i] = low[i] = scc[i] = stk[i] = f[i] = 0, g[i].clear();
        }
    }
    
    void dfs(int t) {
        if (t == pos.size()) {
            for (auto [i, a, j, b] : rule) {
                if (tp[i] != a && tp[j] != b) {
                    int k1 = i, k2 = j;
                    if (tp[i] == 1) k1 += (!a ? 0 : n);
                    else k1 += (tp[i] ? a * n : (a - 1) * n);
    
                    if (tp[j] == 1) k2 += (!b ? 0 : n);
                    else k2 += (tp[j] ? b * n : (b - 1) * n);
    
                    g[k1].push_back(k2);
                    g[(k2 > n ? k2 - n : k2 + n)].push_back(k1 > n ? k1 - n : k1 + n);
                    //cout << tp[i] << ' ' << tp[j] << ' ' << i << ' ' << a << ' ' << j << ' ' << b << ' ' << k1 << ' ' << k2 << '\n';
                } else if (tp[j] == b && tp[i] != a) {
                    int k = i;
                    if (tp[i] == 1) k += (!a ? 0 : n);
                    else k += (tp[i] ? a * n : (a - 1) * n);
                    g[k].push_back((k > n ? k - n : k + n));
                }
            }
            for (int i = 1; i <= n; i++) {
                if (dfn[i] == N && dfn[i + n] == N) {
                    Clear(); return ;
                } else if (dfn[i] == N) tarjan(i + n);
                else if (dfn[i + n] == N) tarjan(i);
            }
            for (int i = 1; i <= 2 * n; i++) if (!dfn[i]) tarjan(i);
            for (int i = 1; i <= n; i++) {
                if (scc[i] == scc[i + n]) {
                    Clear(); return ;
                }
            }
            for (int i = 1; i <= n; i++) {
                int ans = scc[i] > scc[i + n];
                //cout << scc[i] << ' ' << scc[i + n] << ' ';
                cout << char((!tp[i] ? ans + 1 : (tp[i] == 1 ? 2 * ans : ans)) + 'A');
            }
            exit(0);
        }
        tp[pos[t]] = 0, dfs(t + 1);
        tp[pos[t]] = 1, dfs(t + 1);
    }
    
    int main() {
        ios::sync_with_stdio(0), cin.tie(0);
        cin >> n >> d >> s;
        for (int i = 1; i <= n; i++) {
            tp[i] = (s[i - 1] == 'x' ? 3 : s[i - 1] - 'a');
            if (tp[i] == 3) pos.push_back(i);
        }
        cin >> m, rule.resize(m);
        for (auto &[i, a, j, b] : rule) {
            char x, y; cin >> i >> x >> j >> y;
            a = x - 'A', b = y - 'A';
        }
        dfs(0), cout << -1;
        return 0;
    }
    
    • 1

    信息

    ID
    3714
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者