Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const int MAXN = 5e5 + 10;
- struct Node {
- int nxt[2];
- Node() {
- nxt[0] = nxt[1] = -1;
- }
- };
- int cntNodes = 1;
- Node nodes[MAXN * 2];
- int addString(string &s) {
- int cur = 0;
- for (char c : s) {
- if (nodes[cur].nxt[c] == -1) {
- nodes[cur].nxt[c] = cntNodes++;
- }
- cur = nodes[cur].nxt[c];
- }
- return cur;
- }
- int stringVar[MAXN][2];
- vector<int> varInNode[MAXN * 2];
- vector<int> trueOnPrefix[MAXN * 2];
- int trueInSubtree[MAXN * 2];
- string ss[MAXN];
- int main() {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- freopen("binary.in", "r", stdin);
- freopen("binary.out", "w", stdout);
- int n;
- cin >> n;
- forn(i, n) {
- string s;
- cin >> s;
- ss[i] = s;
- int pos = -1;
- forn(j, sz(s)) {
- if (s[j] == '?') {
- pos = j;
- s[j] = '0';
- }
- s[j] -= '0';
- }
- int node1 = addString(s), node2 = -1;
- stringVar[i][0] = newVar();
- varInNode[node1].pb(stringVar[i][0]);
- if (pos != -1) {
- s[pos] += 1;
- node2 = addString(s);
- stringVar[i][1] = newVar();
- varInNode[node2].pb(stringVar[i][1]);
- }
- if (node2 == -1) {
- setTrue(stringVar[i][0]);
- } else {
- Or(stringVar[i][0], stringVar[i][1]);
- }
- }
- forn(node, cntNodes) {
- for (int var : varInNode[node]) {
- int prefVar = newVar();
- if (sz(trueOnPrefix[node])) {
- Nand(trueOnPrefix[node].back(), Not(prefVar));
- Nand(trueOnPrefix[node].back(), var);
- }
- Nand(var, Not(prefVar));
- trueOnPrefix[node].pb(prefVar);
- }
- }
- forn(node, cntNodes) {
- trueInSubtree[node] = newVar();
- }
- forn(node, cntNodes) {
- if (sz(trueOnPrefix[node])) {
- Nand(trueOnPrefix[node].back(), Not(trueInSubtree[node]));
- }
- forn(nxt, 2) {
- int to = nodes[node].nxt[nxt];
- if (to != -1) {
- Nand(Not(trueInSubtree[node]), trueInSubtree[to]);
- if (sz(trueOnPrefix[node])) {
- Nand(trueInSubtree[to], trueOnPrefix[node].back());
- }
- }
- }
- }
- if (!solveSat()) {
- cout << "NO\n";
- return 0;
- }
- cout << "YES\n";
- forn(i, n) {
- forn(j, sz(ss[i])) {
- if (ss[i][j] == '?') {
- ss[i][j] = char('0' + 1 - getVal(stringVar[i][0]));
- }
- }
- cout << ss[i] << '\n';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement