Go to diff to previous submission
#include <iostream> #include <fstream> #include <string> #include <vector> #include <cstdio> #include <set> #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(); } else if(x) { stackInit; } #define stackPush(x) stack.push_back(x); stackTop = stack.rbegin(); #define putc(x) putc(x, stdout) //#define getc() fgetc(in) #define getc() getc(stdin) typedef unsigned int uint; using namespace std; uint lines; string err; char firstC = 0; bool repeated; uint prefixLen; bool prefixOnly; vector<uint> stack; bool emptyStack; vector<uint>::reverse_iterator stackTop; vector<pair<uint, uint> > toDoStack; //From - to void printAllToDo() { for (vector<pair<uint, uint> >::reverse_iterator it = toDoStack.rbegin(); it != toDoStack.rend(); it ++) { for (uint j = it->first; j < it->second; j ++) { putc(err[j]); } } toDoStack.clear(); } void printAll() { for (vector<uint>::iterator it = stack.begin(); it != stack.end(); it ++) { for (uint j = 0; j < *it; j ++) { putc(err[j]); } } stack.clear(); stackInit; } inline void letterMatch() { (*stackTop)++; if (*stackTop == err.size()) { //Found BUG stackPop(true); } } bool apply(char c, bool dontFork) { if (*stackTop > 0) { if (c == firstC && !dontFork && !prefixOnly && *stackTop >= prefixLen) { if (*stackTop == prefixLen) { *stackTop = 1; stackPush(prefixLen); } else stackPush(1); return true; } else if (c == err[*stackTop]) { letterMatch(); return true; } } else if (c == firstC) { //Start new one emptyStack = false; letterMatch(); return true; } return false; } int main() { //FILE* in = fopen("bugs.in", "r"); while(true) { set<char> letters; //if (fscanf(in, "%u", &lines) != 1) return 0; if (scanf("%u", &lines) != 1) return 0; if (getc() < 0) return 0; //space firstC = 0; repeated = false; prefixLen = 0; prefixOnly = true; for (char c = getc(); c != '\n'; c = getc()) { if (c < 0) return 0; err.push_back(c); letters.insert(c); if (!firstC) firstC = c; else if (firstC == c) repeated = true; if (prefixOnly) { if (firstC == c) prefixLen ++; else prefixOnly = false; } } printf("%s", err.c_str()); stackInit; pair<uint, uint> tmpPair = make_pair(0, 0); char c; for (uint i = 0; i < lines; i += (c == '\n' ? 1 : 0)) { c = getc(); if (c < 0) return 0; bool wasFromStack = false; do { bool fromStack = toDoStack.size(); const pair<uint, uint> &back = (fromStack ? toDoStack.back() : tmpPair ); char d = (fromStack ? err[back.first] : c); if (apply(d, fromStack && back.first == 0)) { //Applied - good if (fromStack) { if ((back.first + 1) == back.second) { //Finished whole word toDoStack.pop_back(); } else { toDoStack.rbegin()->first ++; //Increment if you did not } } else wasFromStack = false; continue; } if (emptyStack) { putc(c); continue; } if (stack.size()) { //Did not applied if (repeated) { //Need toDoStack if (letters.find(c) == letters.end()) { printAll(); putc(c); wasFromStack = false; } else { toDoStack.push_back(make_pair(0, *stackTop)); stackPop(false); if (!stack.size()) { printAllToDo(); putc(c); stackInit; wasFromStack = false; } else wasFromStack = true; } } else { //Do not need toDo stack printAll(); putc(c); wasFromStack = false; } } } while (toDoStack.size() || wasFromStack); fflush(stdout); } err.clear(); } return 0; }
--- c4.s1077.cteam093.bugs.cpp.0.bugs.cpp +++ c4.s1154.cteam093.bugs.cpp.0.bugs.cpp @@ -8,5 +8,5 @@ #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(); } else if(x) { stackInit; } -#define stackPush(x) stack.push_back(x); if (stack.size()) { stackTop = stack.rbegin(); } else stackInit; +#define stackPush(x) stack.push_back(x); stackTop = stack.rbegin(); #define putc(x) putc(x, stdout) @@ -20,4 +20,6 @@ char firstC = 0; bool repeated; +uint prefixLen; +bool prefixOnly; vector<uint> stack; bool emptyStack; @@ -52,6 +54,10 @@ bool apply(char c, bool dontFork) { if (*stackTop > 0) { - if (c == firstC && !dontFork) { - stackPush(1); + if (c == firstC && !dontFork && !prefixOnly && *stackTop >= prefixLen) { + if (*stackTop == prefixLen) { + *stackTop = 1; + stackPush(prefixLen); + } + else stackPush(1); return true; } @@ -80,4 +86,6 @@ firstC = 0; repeated = false; + prefixLen = 0; + prefixOnly = true; for (char c = getc(); c != '\n'; c = getc()) { if (c < 0) return 0; @@ -86,5 +94,10 @@ if (!firstC) firstC = c; else if (firstC == c) repeated = true; + if (prefixOnly) { + if (firstC == c) prefixLen ++; + else prefixOnly = false; + } } + printf("%s", err.c_str()); stackInit; pair<uint, uint> tmpPair = make_pair(0, 0); @@ -141,4 +154,5 @@ } } while (toDoStack.size() || wasFromStack); + fflush(stdout); } err.clear();