Source code for submission s965

Go to diff to previous submission

bugs.cpp

  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5. #include <cstdio>
  6.  
  7. #define stackInit if (!stack.size()) { stack.push_back(0); stackTop = stack.rbegin(); emptyStack = true; }
  8. #define stackPop(x) stack.pop_back(); if (stack.size()) { stackTop = stack.rbegin(); } else if(x) { stackInit; }
  9. #define stackPush(x) stack.push_back(x); if (stack.size()) { stackTop = stack.rbegin(); } else stackInit;
  10.  
  11. #define putc(x) putc(x, stdout)
  12. //#define getc() fgetc(in)
  13. #define getc() getc(stdin)
  14. typedef unsigned int uint;
  15. using namespace std;
  16.  
  17. uint lines;
  18. string err;
  19. char firstC = 0;
  20. bool repeated;
  21. vector<uint> stack;
  22. bool emptyStack;
  23. vector<uint>::reverse_iterator stackTop;
  24. vector<pair<uint, uint> > toDoStack; //From - to
  25.  
  26. void printAllToDo() {
  27. for (vector<pair<uint, uint> >::reverse_iterator it = toDoStack.rbegin(); it != toDoStack.rend(); it ++) {
  28. for (uint j = it->first; j < it->second; j ++) {
  29. putc(err[j]);
  30. }
  31. }
  32. toDoStack.clear();
  33. }
  34.  
  35. void printAll() {
  36. for (vector<uint>::iterator it = stack.begin(); it != stack.end(); it ++) {
  37. for (uint j = 0; j < *it; j ++) {
  38. putc(err[j]);
  39. }
  40. }
  41. stack.clear();
  42. stackInit;
  43. }
  44. inline void letterMatch() {
  45. (*stackTop)++;
  46. if (*stackTop == err.size()) { //Found BUG
  47. stackPop(true);
  48. }
  49. }
  50.  
  51. bool apply(char c, bool dontFork) {
  52. if (*stackTop > 0) {
  53. if (c == firstC && !dontFork) {
  54. stackPush(1);
  55. return true;
  56. }
  57. else if (c == err[*stackTop]) {
  58. letterMatch();
  59. return true;
  60. }
  61. }
  62. else if (c == firstC) { //Start new one
  63. emptyStack = false;
  64. letterMatch();
  65. return true;
  66. }
  67. return false;
  68. }
  69.  
  70.  
  71. int main()
  72. {
  73. //FILE* in = fopen("bugs.in", "r");
  74. while(true) {
  75. //if (fscanf(in, "%u", &lines) != 1) return 0;
  76. if (scanf("%u", &lines) != 1) return 0;
  77. if (getc() < 0) return 0; //space
  78. firstC = 0;
  79. repeated = false;
  80. for (char c = getc(); c != '\n'; c = getc()) {
  81. if (c < 0) return 0;
  82. err.push_back(c);
  83. if (!firstC) firstC = c;
  84. else if (firstC == c) repeated = true;
  85. }
  86. stackInit;
  87. pair<uint, uint> tmpPair = make_pair(0, 0);
  88. char c;
  89. for (uint i = 0; i < lines; i += (c == '\n' ? 1 : 0)) {
  90. c = getc();
  91. if (c < 0) return 0;
  92. bool wasFromStack = false;
  93. do {
  94. bool fromStack = toDoStack.size();
  95. const pair<uint, uint> &back = (fromStack ? toDoStack.back() : tmpPair );
  96. char d = (fromStack ? err[back.first] : c);
  97. if (apply(d, fromStack && back.first == 0)) { //Applied - good
  98. if (fromStack) {
  99. if ((back.first + 1) == back.second) { //Finished whole word
  100. toDoStack.pop_back();
  101. }
  102. else {
  103. toDoStack.rbegin()->first ++; //Increment if you did not
  104. }
  105. }
  106. else wasFromStack = false;
  107. continue;
  108. }
  109. if (emptyStack) {
  110. putc(c);
  111. continue;
  112. }
  113. if (stack.size()) { //Did not applied
  114. if (repeated) { //Need toDoStack
  115. toDoStack.push_back(make_pair(0, *stackTop));
  116. stackPop(false);
  117. if (!stack.size()) {
  118. printAllToDo();
  119. putc(c);
  120. stackInit;
  121. wasFromStack = false;
  122. }
  123. else wasFromStack = true;
  124. }
  125. else { //Do not need toDo stack
  126. printAll();
  127. putc(c);
  128. wasFromStack = false;
  129. }
  130.  
  131. }
  132. } while (toDoStack.size() || wasFromStack);
  133. }
  134. err.clear();
  135. }
  136.  
  137. return 0;
  138. }
  139.  

Diff to submission s938

bugs.cpp

--- c4.s938.cteam093.bugs.cpp.0.bugs.cpp
+++ c4.s965.cteam093.bugs.cpp.0.bugs.cpp
@@ -6,7 +6,8 @@
 
 #define stackInit if (!stack.size()) { stack.push_back(0); stackTop = stack.rbegin(); emptyStack = true; }
-#define stackPop(x) stack.pop_back(); if (stack.size()) { stackTop = stack.rbegin(); } if(x) { stackInit; }
-#define stackPush(x) stack.push_back(x); if (stack.size()) { stackTop = stack.rbegin(); } stackInit;
+#define stackPop(x) stack.pop_back(); if (stack.size()) { stackTop = stack.rbegin(); } else if(x) { stackInit; }
+#define stackPush(x) stack.push_back(x); if (stack.size()) { stackTop = stack.rbegin(); } else stackInit;
 
+#define putc(x) putc(x, stdout)
 //#define getc() fgetc(in)
 #define getc() getc(stdin)
@@ -26,5 +27,5 @@
     for (vector<pair<uint, uint> >::reverse_iterator it = toDoStack.rbegin(); it != toDoStack.rend(); it ++) {
         for (uint j = it->first; j < it->second; j ++) {
-            printf("%c", err[j]);
+            putc(err[j]);
         }
     }
@@ -35,5 +36,5 @@
     for (vector<uint>::iterator it = stack.begin(); it != stack.end(); it ++) {
         for (uint j = 0; j < *it; j ++) {
-            printf("%c", err[j]);
+            putc(err[j]);
         }
     }
@@ -72,6 +73,6 @@
     //FILE* in = fopen("bugs.in", "r");
     while(true) {
-        //if (fscanf(in, "%d", &lines) != 1) return 0;
-        if (scanf("%d", &lines) != 1) return 0;
+        //if (fscanf(in, "%u", &lines) != 1) return 0;
+        if (scanf("%u", &lines) != 1) return 0;
         if (getc() < 0) return 0; //space
         firstC = 0;
@@ -107,5 +108,5 @@
                 }
                 if (emptyStack) {
-                    printf("%c", c);
+                    putc(c);
                     continue;
                 }
@@ -116,5 +117,5 @@
                         if (!stack.size()) {
                             printAllToDo();
-                            printf("%c", c);
+                            putc(c);
                             stackInit;
                             wasFromStack = false;
@@ -124,5 +125,5 @@
                     else { //Do not need toDo stack
                         printAll();
-                        printf("%c", c);
+                        putc(c);
                         wasFromStack = false;
                     }