第43个点WA了,应该是YES但我输出NO,求巨佬帮忙调调qaq
#include <bits/stdc++.h>
using namespace std;
using Pii = pair<int, int>;
const int kMaxN = 6e6 + 5;
int dfn[kMaxN], low[kMaxN], st[kMaxN], vis[kMaxN], cnt, tot;
int p[kMaxN], l[kMaxN], r[kMaxN], a[kMaxN], pos[kMaxN], c, v, id, n, m, k;
int pl[kMaxN], pr[kMaxN], w[kMaxN][2], fl[kMaxN], fr[kMaxN];
string s[kMaxN];
vector<int> g[kMaxN], _id[kMaxN];
void Tarjan(int u) {
vis[st[++tot] = u] = 1;
low[u] = dfn[u] = ++cnt;
for (int i : g[u]) {
if (!dfn[i]) {
Tarjan(i);
low[u] = min(low[u], low[i]);
} else if (vis[i]) {
low[u] = min(low[u], dfn[i]);
}
}
if (dfn[u] == low[u]) {
++id;
for (; st[tot + 1] != u; vis[st[tot]] = 0, p[st[tot]] = id, tot--) {
}
}
}
void Update(string s, int x, int y) {
int p = 0;
for (int i = 0; i < s.size(); i++) {
int x = s[i] - '0';
!w[p][x] && (w[p][x] = ++c);
p = w[p][x];
}
_id[p].push_back(x * 2 - 1 + y);
}
void Build(vector<int> f) {
for (int i = 0; i < f.size(); i++) {
fl[i] = ++v;
g[fl[i]].push_back((f[i] & 1) ? f[i] + 1 : f[i] - 1);
if (i) {
g[fl[i]].push_back(fl[i - 1]);
}
}
if (f.size()) {
for (int i = f.size() - 1; i >= 0; i--) {
fr[i] = ++v;
g[fr[i]].push_back((f[i] & 1) ? f[i] + 1 : f[i] - 1);
if (i + 1 < f.size()) {
g[fl[i]].push_back(fl[i + 1]);
}
}
}
for (int i = 0; i < f.size(); i++) {
if (i) {
g[f[i]].push_back(fl[i - 1]);
}
if (i + 1 < f.size()) {
g[f[i]].push_back(fr[i + 1]);
}
}
}
void Solve(int u, int fa) {
pl[u] = ++v, pr[u] = ++v;
for (int i = 0; i < 2; i++) {
if (w[u][i]) {
Solve(w[u][i], u);
g[pl[w[u][i]]].push_back(pl[u]);
g[pr[u]].push_back(pr[w[u][i]]);
}
}
Build(_id[u]);
for (int i : _id[u]) {
g[pl[u]].push_back((i & 1) ? i + 1 : i - 1);
g[pr[u]].push_back((i & 1) ? i + 1 : i - 1);
if (fa != -1) {
g[i].push_back(pl[fa]);
}
for (int j = 0; j < 2; j++) {
if (w[u][j]) {
g[i].push_back(pr[w[u][j]]);
}
}
}
}
int main() {
ios ::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s[i];
int vis = 0;
for (int j = 0; j < s[i].size(); j++) {
if (s[i][j] == '?') {
s[i][j] = '0';
Update(s[i], i, 0);
s[i][j] = '1';
Update(s[i], i, 1);
s[i][j] = '?';
vis = 1;
break;
}
}
if (!vis) {
Update(s[i], i, 0);
Update(s[i], i, 1);
}
}
v = n * 2;
Solve(0, -1);
for (int i = 1; i <= v; i++) {
!dfn[i] && (Tarjan(i), 1);
}
for (int i = 1; i <= n * 2; i += 2) {
if (p[i] == p[i + 1]) {
cout << "NO";
return 0;
}
}
cout << "YES\n";
for (int i = 1; i <= n * 2; i += 2) {
if (p[i] > p[i + 1]) {
for (char j : s[(i + 1) / 2]) {
cout << (j == '?' ? '1' : j);
}
} else {
for (char j : s[(i + 1) / 2]) {
cout << (j == '?' ? '0' : j);
}
}
cout << "\n";
}
return 0;
}