WA on 9,10 求调
查看原帖
WA on 9,10 求调
214853
Mecci_miaowu楼主2024/10/20 20:03
#include<bits/stdc++.h>
using namespace std;

using i64 = long long;

int n, d, m, res = 0;
string s;
vector<int> x, a, b;
vector<char> aa, bb;

vector<vector<int>> p;

char dif[3][3] = { {' ', 'C', 'B'}, 
                   {'C', ' ', 'A'}, 
                   {'B', 'A', ' '}
                 };

vector<int> dfn, low, col;
int dfncnt, colcnt;
vector<bool> ins;
stack<int> S;
void tarjan(int id) {
    dfn[id] = low[id] = ++dfncnt;
    S.push(id);
    ins[id] = 1;
    for(auto &i : p[id]) {
        if(!dfn[i]) {
            tarjan(i);
            low[id] = min(low[id], low[i]);
        }
        else if(ins[i]) {
            low[id] = min(low[id], dfn[i]);
        }
    }
    if(dfn[id] == low[id]) {
        while(S.top() != id) {
            col[S.top()] = colcnt;
            ins[S.top()] = 0;
            S.pop();
        }
        col[S.top()] = colcnt;
        ins[S.top()] = 0;
        S.pop();
        ++colcnt;
    }
}

void solve() {
    map<pair<int, char>, int> mp;
    // map<int, pair<int, char>> mp2;
    int cnt = 1;
    for(int i = 0; i < s.size(); ++i) {
        int ch = s[i] - 'A';
        // cout << cnt << ' ' << i << ' ' << (char)((ch + 1) % 3 + 'A') << '\n';
        // mp2[cnt] = {i, (char)((ch + 1) % 3 + 'A')};
        mp[{i, (ch + 1) % 3 + 'A'}] = cnt++;
        // cout << cnt << ' ' << i << ' ' << dif[(ch + 1) % 3][ch] << '\n';
        // mp2[cnt] = {i, dif[(ch + 1) % 3][ch]};
        mp[{i, dif[(ch + 1) % 3][ch]}] = cnt++;
    }
    {
        vector<vector<int>> pp(cnt);
        swap(p, pp);
    }
    dfn.resize(cnt, 0);
    low.resize(cnt, 0);
    col.resize(cnt, 0);
    ins.resize(cnt, 0);
    dfncnt = 0;
    colcnt = 1;
    while(S.size()) S.pop();
    for(int i = 0; i < m; ++i) {
        int u = mp[{a[i], aa[i]}], 
            v = mp[{b[i], bb[i]}],
            uu = mp[{a[i], dif[s[a[i]] - 'A'][aa[i] - 'A']}],
            vv = mp[{b[i], dif[s[b[i]] - 'A'][bb[i] - 'A']}];
            // cout << u << ' ' << v << ' ' << uu << ' ' << vv << '\n';
        if(s[a[i]] == aa[i]) {
            continue;
        }
        else if(s[b[i]] == bb[i]) {
            p[u].push_back(uu);
        }
        else {
            p[u].push_back(v);
            p[vv].push_back(uu);
        }
    }
    for(int i = 1; i < cnt; ++i) {
        if(!dfn[i]) {
            tarjan(i);
        }
    }
    vector<char> res;
    // cout << s << '\n';
    for(int i = 0; i < s.size(); ++i) {
        int ch = s[i] - 'A';
        int a = mp[{i, (ch + 1) % 3 + 'A'}], b = mp[{i, dif[(ch + 1) % 3][ch]}];
        // cout << a << ' ' << col[a] << ' ' << (char)((ch + 1) % 3 + 'A') <<'\n';
        // cout << b << ' ' << col[b] << ' ' << dif[(ch + 1) % 3][ch] << '\n';
        if(col[a] == col[b]) {
            return;
        }
        else {
            if(col[a] < col[b]) {
                res.push_back((ch + 1) % 3 + 'A');
            }
            else {
                res.push_back(dif[(ch + 1) % 3][ch]);
            }
        }
    }
    // for(int i = 1; i < cnt; ++i) {
    //     for(auto &x : p[i]) {
    //         auto [a, b] = mp2[i];
    //         auto [c, d] = mp2[x];
    //         cout << a << b << "->" << c << d << '\n';
    //     }
    // }
    for(auto &x : res) {
        cout << x;
    }
    exit(0);
}

void dfs(int id) {
    if(id == x.size()) {
        solve();
        return;
    }
    s[x[id]] = 'A';
    dfs(id + 1);
    s[x[id]] = 'B';
    dfs(id + 1);
    s[x[id]] = 'C';
    dfs(id + 1);
}

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

    cin >> n >> d;
    cin >> s;
    cin >> m;
    
    for(int i = 0; i < m; ++i) {
        int s, t;
        char u, v;
        cin >> s >> u >> t >> v;
        a.push_back(s - 1);
        b.push_back(t - 1);
        aa.push_back(u);
        bb.push_back(v);
    }
    
    for(int i = 0; i < s.size(); ++i) {
        s[i] = s[i] - 'a' + 'A';
        if(s[i] == 'X') {
            x.push_back(i);
        }
    }

    dfs(0);

    cout << -1;

    return 0;
}
2024/10/20 20:03
加载中...