Go to diff to previous submission
#include <cstdio> #include <cstring> #include <string> int main() { int nrows; char key[2000]; char line[2000002]; int *begin = new int[2000002]; int *end = new int[2000002]; bool print[2000002]; //gets (line); //printf ("%s", line); while (scanf ("%d %s", &nrows, key) == 2) { int ksize = strlen (key); char dummy[10]; gets (dummy); for (int i = 0; i < nrows; i++) { gets (line); int size = strlen (line); //printf ("%s\n", line); int prev = 0; for (int j = 0; j < size; j++) { if (line[j] == key[prev]) { prev++; begin[j] = prev; } else if (line[j] == key[0]) { begin[j] = 1; prev = 1; } else begin[j] = 0; prev = begin[j] % ksize; } /* for (int j = 0; j < size; j++) printf ("%d ", begin[j]); printf ("\n"); */ prev = ksize - 1; for (int j = size - 1; j >= 0; j--) { if (line[j] == key[prev]) { end[j] = ksize - prev; prev--; } else if (line[j] == key[ksize - 1]) { end[j] = 1; prev = ksize - 2; } else end[j] = 0; if (prev < 0) prev += ksize; } /* for (int j = 0; j < size; j++) printf ("%d ", end[j]); printf ("\n"); */ int pos = 0; memset (print, 1, sizeof (print)); for ( ; ;) { if (pos >= size) break; if (begin[pos] == ksize) { memset (print + pos - ksize + 1, 0, ksize); int bpos = pos - ksize; int epos = pos + 1; //printf ("%d %d\n", bpos, epos); while (bpos >= 0 && epos < size) { if (begin[bpos] + end[epos] == ksize && print[bpos] && print[epos]) { memset (print + (bpos - begin[bpos]) + 1, 0, begin[bpos]); memset (print + epos, 0, end[epos]); bpos = bpos - begin[bpos]; epos = epos + end[epos]; } else break; } pos = epos; continue; } pos++; } /* for (int i = 0; i < size; i++) printf ("%d ", print[i]); printf ("\n"); */ for (int i = 0; i < size; i++) if (print[i]) printf ("%c", line[i]); printf("\n"); } } return 0; }