Source code for submission s938

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