Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.16 KB | None | 0 0
  1. const int MAXN = 5e5 + 10;
  2.  
  3. struct Node {
  4. int nxt[2];
  5.  
  6. Node() {
  7. nxt[0] = nxt[1] = -1;
  8. }
  9. };
  10.  
  11. int cntNodes = 1;
  12. Node nodes[MAXN * 2];
  13.  
  14. int addString(string &s) {
  15. int cur = 0;
  16. for (char c : s) {
  17. if (nodes[cur].nxt[c] == -1) {
  18. nodes[cur].nxt[c] = cntNodes++;
  19. }
  20. cur = nodes[cur].nxt[c];
  21. }
  22. return cur;
  23. }
  24.  
  25. int stringVar[MAXN][2];
  26. vector<int> varInNode[MAXN * 2];
  27. vector<int> trueOnPrefix[MAXN * 2];
  28. int trueInSubtree[MAXN * 2];
  29.  
  30. string ss[MAXN];
  31.  
  32. int main() {
  33. ios_base::sync_with_stdio(0);
  34. cin.tie(0);
  35. freopen("binary.in", "r", stdin);
  36. freopen("binary.out", "w", stdout);
  37. int n;
  38. cin >> n;
  39. forn(i, n) {
  40. string s;
  41. cin >> s;
  42. ss[i] = s;
  43. int pos = -1;
  44. forn(j, sz(s)) {
  45. if (s[j] == '?') {
  46. pos = j;
  47. s[j] = '0';
  48. }
  49. s[j] -= '0';
  50. }
  51. int node1 = addString(s), node2 = -1;
  52. stringVar[i][0] = newVar();
  53. varInNode[node1].pb(stringVar[i][0]);
  54.  
  55. if (pos != -1) {
  56. s[pos] += 1;
  57. node2 = addString(s);
  58. stringVar[i][1] = newVar();
  59. varInNode[node2].pb(stringVar[i][1]);
  60. }
  61.  
  62. if (node2 == -1) {
  63. setTrue(stringVar[i][0]);
  64. } else {
  65. Or(stringVar[i][0], stringVar[i][1]);
  66. }
  67. }
  68. forn(node, cntNodes) {
  69. for (int var : varInNode[node]) {
  70. int prefVar = newVar();
  71. if (sz(trueOnPrefix[node])) {
  72. Nand(trueOnPrefix[node].back(), Not(prefVar));
  73. Nand(trueOnPrefix[node].back(), var);
  74. }
  75. Nand(var, Not(prefVar));
  76. trueOnPrefix[node].pb(prefVar);
  77. }
  78. }
  79. forn(node, cntNodes) {
  80. trueInSubtree[node] = newVar();
  81. }
  82. forn(node, cntNodes) {
  83. if (sz(trueOnPrefix[node])) {
  84. Nand(trueOnPrefix[node].back(), Not(trueInSubtree[node]));
  85. }
  86. forn(nxt, 2) {
  87. int to = nodes[node].nxt[nxt];
  88. if (to != -1) {
  89. Nand(Not(trueInSubtree[node]), trueInSubtree[to]);
  90. if (sz(trueOnPrefix[node])) {
  91. Nand(trueInSubtree[to], trueOnPrefix[node].back());
  92. }
  93. }
  94. }
  95. }
  96. if (!solveSat()) {
  97. cout << "NO\n";
  98. return 0;
  99. }
  100. cout << "YES\n";
  101. forn(i, n) {
  102. forn(j, sz(ss[i])) {
  103. if (ss[i][j] == '?') {
  104. ss[i][j] = char('0' + 1 - getVal(stringVar[i][0]));
  105. }
  106. }
  107. cout << ss[i] << '\n';
  108. }
  109.  
  110. return 0;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement