#define DUMPIDX 2
// 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;
}
//ppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 89.06 us | 1 MB + 276 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #2 | 89.6 us | 1 MB + 276 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #3 | 90.01 us | 1 MB + 276 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #4 | 89.4 us | 1 MB + 276 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #5 | 89.12 us | 1 MB + 276 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #6 | 90.33 us | 1 MB + 276 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #7 | 93.04 us | 1 MB + 276 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #8 | 92.73 us | 1 MB + 276 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #9 | 99.53 us | 1 MB + 276 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #10 | 120.33 us | 1 MB + 276 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #11 | 103.23 us | 1 MB + 280 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #12 | 102.32 us | 1 MB + 280 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #13 | 101.07 us | 1 MB + 280 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #14 | 101.9 us | 1 MB + 280 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #15 | 708.65 us | 1 MB + 816 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #16 | 437.94 us | 1 MB + 880 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #17 | 430.04 us | 1 MB + 884 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #18 | 2.553 ms | 6 MB + 608 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #19 | 4.833 ms | 8 MB + 380 KB | Accepted | Score: 5 | 显示更多 |
| Testcase #20 | 4.951 ms | 8 MB + 380 KB | Accepted | Score: 5 | 显示更多 |