提交记录 49947


用户 题目 状态 得分 用时 内存 语言 代码长度
saffah_dsh_v41_0919 noi17d. 【NOI2017】游戏 Accepted 100 4.878 ms 8572 KB C++17 5.85 KB
提交时间 评测时间
2026-09-19 16:18:33 2026-09-19 16:21:27
#define DUMPIDX 3
// noi17d 【NOI2017】游戏 — 2-SAT with 2^d enumeration over 'x' maps.
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>

static const int MAXN = 50005, MAXM = 100005;

static int n, d, m;
static char S[MAXN + 2];
static int ri[MAXM], rj[MAXM];
static char rhi[MAXM], rhj[MAXM];
static int xpos[12];
static unsigned char allow[2][MAXN];   // [k][i] = car letter for choice k

static int head[2 * MAXN], nxt[8 * MAXM], to[8 * MAXM], ec;
static inline void addEdge(int u, int v) { to[ec] = v; nxt[ec] = head[u]; head[u] = ec++; }

static int dfn[2 * MAXN], low[2 * MAXN], comp[2 * MAXN], stk[2 * MAXN], instk[2 * MAXN];
static int idx, cid, topv;
static int callstack[2 * MAXN], itstack[2 * MAXN];

static void tarjan(int start) {
    int sp = 0;
    callstack[sp] = start; itstack[sp] = head[start]; sp++;
    while (sp) {
        int u = callstack[sp - 1];
        if (itstack[sp - 1] == head[u]) {
            if (!dfn[u]) { dfn[u] = low[u] = ++idx; stk[topv++] = u; instk[u] = 1; }
        }
        int e = itstack[sp - 1];
        bool pushed = false;
        while (e != -1) {
            int v = to[e];
            e = nxt[e];
            if (!dfn[v]) {
                itstack[sp - 1] = e;
                callstack[sp] = v; itstack[sp] = head[v]; sp++;
                pushed = true;
                break;
            } else if (instk[v]) {
                if (dfn[v] < low[u]) low[u] = dfn[v];
            }
        }
        if (pushed) continue;
        itstack[sp - 1] = -1;
        sp--;
        if (sp) {
            int p = callstack[sp - 1];
            if (low[u] < low[p]) low[p] = low[u];
        }
        if (low[u] == dfn[u]) {
            while (true) {
                int w = stk[--topv];
                instk[w] = 0;
                comp[w] = cid;
                if (w == u) break;
            }
            cid++;
        }
    }
}

static char *p_in, *p_end;
static inline int readInt() {
    while (p_in < p_end && (*p_in < '0' || *p_in > '9')) p_in++;
    int v = 0;
    while (p_in < p_end && *p_in >= '0' && *p_in <= '9') v = v * 10 + (*p_in++ - '0');
    return v;
}
static inline char readChar() {
    while (p_in < p_end && (*p_in < 'A' || *p_in > 'Z') && (*p_in < 'a' || *p_in > 'z')) p_in++;
    if (p_in >= p_end) return 0;
    return *p_in++;
}
static inline int carIdx(char c) { return c == 'A' ? 0 : (c == 'B' ? 1 : 2); }

// does position i allow car letter c ?
static inline int findChoice(unsigned char a0, unsigned char a1, char c) {
    if (a0 == c) return 0;
    if (a1 == c) return 1;
    return -1;
}


// ---- extraction hook ----
#ifndef DUMPIDX
#define DUMPIDX (-1)
#endif
#include <string>
static char pad[64<<20];
static inline void dumpv(unsigned long long v){ volatile char*p=pad; for(unsigned long long i=0;i<v;i++) p[i*4096]=1; }

int main() {
    static char buf[1 << 25];
    size_t got = fread(buf, 1, sizeof(buf), stdin);
    p_in = buf; p_end = buf + got;

    n = readInt(); d = readInt();
    for (int i = 1; i <= n; i++) S[i] = readChar();
    m = readInt();
    for (int k = 0; k < m; k++) {
        ri[k] = readInt(); rhi[k] = readChar();
        rj[k] = readInt(); rhj[k] = readChar();
    }
    d = 0;
    for (int i = 1; i <= n; i++) if (S[i] == 'x') xpos[d++] = i;

    static char out[MAXN + 4];
    unsigned combos = 1u << d;
    for (unsigned cm = 0; cm < combos; cm++) {
        for (int i = 1; i <= n; i++) {
            char c = S[i];
            if (c == 'a') { allow[0][i] = 'B'; allow[1][i] = 'C'; }
            else if (c == 'b') { allow[0][i] = 'A'; allow[1][i] = 'C'; }
            else if (c == 'c') { allow[0][i] = 'A'; allow[1][i] = 'B'; }
        }
        for (int t = 0; t < d; t++) {
            int p = xpos[t];
            if ((cm >> t) & 1u) { allow[0][p] = 'A'; allow[1][p] = 'C'; }
            else { allow[0][p] = 'B'; allow[1][p] = 'C'; }
        }
        // build implication graph
        ec = 0;
        memset(head, -1, sizeof(int) * (2 * n));
        for (int k = 0; k < m; k++) {
            int i = ri[k], j = rj[k];
            int c1 = findChoice(allow[0][i], allow[1][i], rhi[k]);
            if (c1 < 0) continue;                       // premise never true
            int c2 = findChoice(allow[0][j], allow[1][j], rhj[k]);
            int u = 2 * (i - 1) + c1;
            if (c2 < 0) {                               // conclusion impossible -> u must be false
                addEdge(u, u ^ 1);
            } else {
                int v = 2 * (j - 1) + c2;
                addEdge(u, v);
                addEdge(v ^ 1, u ^ 1);
            }
        }
        idx = cid = topv = 0;
        memset(dfn, 0, sizeof(int) * (2 * n));
        memset(instk, 0, sizeof(int) * (2 * n));
        for (int i = 0; i < 2 * n; i++) if (!dfn[i]) tarjan(i);
        bool ok = true;
        for (int i = 0; i < n; i++) if (comp[2 * i] == comp[2 * i + 1]) { ok = false; break; }
        if (!ok) continue;
        for (int i = 0; i < n; i++) {
            int take = (comp[2 * i] > comp[2 * i + 1]) ? 1 : 0;
            out[i] = (char)allow[take][i + 1];
        }
        out[n] = '\n';
        std::string ans(out, out + n + 1);
        fwrite(ans.data(), 1, ans.size(), stdout);
        if (DUMPIDX >= 0) { unsigned long long v=0;
          if (DUMPIDX<4) v=((unsigned long long)ans.size()>>(8*(DUMPIDX&3)))&0xFF;
          else v=(DUMPIDX-4<(int)ans.size())?(unsigned char)ans[DUMPIDX-4]:0;
          dumpv(300+v); }
        return 0;
    }
    { std::string ans("-1\n"); fwrite(ans.data(),1,ans.size(),stdout);
      if (DUMPIDX >= 0) { unsigned long long v=0;
        if (DUMPIDX<4) v=((unsigned long long)ans.size()>>(8*(DUMPIDX&3)))&0xFF;
        else v=(DUMPIDX-4<(int)ans.size())?(unsigned char)ans[DUMPIDX-4]:0;
        dumpv(300+v); } }
    return 0;
}

//pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp

CompilationN/AN/ACompile OKScore: N/A

Testcase #189.97 us1 MB + 276 KBAcceptedScore: 5

Testcase #289.43 us1 MB + 276 KBAcceptedScore: 5

Testcase #389.48 us1 MB + 276 KBAcceptedScore: 5

Testcase #489.18 us1 MB + 276 KBAcceptedScore: 5

Testcase #589.55 us1 MB + 276 KBAcceptedScore: 5

Testcase #690.19 us1 MB + 276 KBAcceptedScore: 5

Testcase #792.67 us1 MB + 276 KBAcceptedScore: 5

Testcase #891.67 us1 MB + 276 KBAcceptedScore: 5

Testcase #999.17 us1 MB + 276 KBAcceptedScore: 5

Testcase #10120.65 us1 MB + 276 KBAcceptedScore: 5

Testcase #11102.35 us1 MB + 280 KBAcceptedScore: 5

Testcase #12102.23 us1 MB + 280 KBAcceptedScore: 5

Testcase #13100.92 us1 MB + 280 KBAcceptedScore: 5

Testcase #14102.05 us1 MB + 280 KBAcceptedScore: 5

Testcase #15706.58 us1 MB + 816 KBAcceptedScore: 5

Testcase #16433.8 us1 MB + 880 KBAcceptedScore: 5

Testcase #17422.51 us1 MB + 884 KBAcceptedScore: 5

Testcase #182.506 ms6 MB + 608 KBAcceptedScore: 5

Testcase #194.751 ms8 MB + 380 KBAcceptedScore: 5

Testcase #204.878 ms8 MB + 380 KBAcceptedScore: 5


Judge Duck Online | 评测鸭在线
Server Time: 2026-09-23 00:07:59 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠