MnZn初学OI求助
查看原帖
MnZn初学OI求助
677234
FstAutoMaton楼主2024/7/26 13:18

第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;
}
2024/7/26 13:18
加载中...