Source code for submission s1160

Go to diff to previous submission

bugs.cpp

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <string>
  4.  
  5. int main() {
  6. int nrows;
  7. char key[2000];
  8. char line[2000002];
  9. int *begin = new int[2000002];
  10. int *end = new int[2000002];
  11. bool print[2000002];
  12. //gets (line);
  13. //printf ("%s", line);
  14. while (scanf ("%d %s", &nrows, key) == 2) {
  15. int ksize = strlen (key);
  16. char dummy[10];
  17. gets (dummy);
  18. for (int i = 0; i < nrows; i++) {
  19. gets (line);
  20. int size = strlen (line);
  21.  
  22. //printf ("%s\n", line);
  23. int prev = 0;
  24. for (int j = 0; j < size; j++) {
  25. if (line[j] == key[prev]) {
  26. prev++;
  27. begin[j] = prev;
  28. }
  29. else if (line[j] == key[0]) {
  30. begin[j] = 1;
  31. prev = 1;
  32. }
  33. else begin[j] = 0;
  34. prev = begin[j] % ksize;
  35. }
  36.  
  37. /*
  38. for (int j = 0; j < size; j++)
  39. printf ("%d ", begin[j]);
  40. printf ("\n");
  41. */
  42.  
  43. prev = ksize - 1;
  44. for (int j = size - 1; j >= 0; j--) {
  45. if (line[j] == key[prev]) {
  46. end[j] = ksize - prev;
  47. prev--;
  48. }
  49. else if (line[j] == key[ksize - 1]) {
  50. end[j] = 1;
  51. prev = ksize - 2;
  52. }
  53. else end[j] = 0;
  54. if (prev < 0) prev += ksize;
  55. }
  56. /*
  57. for (int j = 0; j < size; j++)
  58. printf ("%d ", end[j]);
  59. printf ("\n");
  60. */
  61. int pos = 0;
  62. memset (print, 1, sizeof (print));
  63. for ( ; ;) {
  64. if (pos >= size) break;
  65. if (begin[pos] == ksize) {
  66. memset (print + pos - ksize + 1, 0, ksize);
  67.  
  68. int bpos = pos - ksize;
  69. int epos = pos + 1;
  70. //printf ("%d %d\n", bpos, epos);
  71.  
  72. while (bpos >= 0 && epos < size) {
  73. if (begin[bpos] + end[epos] == ksize && print[bpos] && print[epos]) {
  74. memset (print + (bpos - begin[bpos]) + 1, 0, begin[bpos]);
  75. memset (print + epos, 0, end[epos]);
  76. bpos = bpos - begin[bpos];
  77. epos = epos + end[epos];
  78. }
  79. else break;
  80. }
  81. pos = epos;
  82. continue;
  83. }
  84. pos++;
  85. }
  86. /*
  87. for (int i = 0; i < size; i++)
  88. printf ("%d ", print[i]);
  89. printf ("\n");
  90. */
  91. for (int i = 0; i < size; i++)
  92. if (print[i])
  93. printf ("%c", line[i]);
  94. printf("\n");
  95. }
  96. }
  97.  
  98. return 0;
  99. }

Diff to submission s1155

bugs.cpp

--- c4.s1155.cteam010.bugs.cpp.0.bugs.cpp
+++ c4.s1160.cteam010.bugs.cpp.0.bugs.cpp
@@ -62,5 +62,5 @@
                         memset (print, 1, sizeof (print));
                         for ( ; ;) {
-                                if (pos == size) break;
+                                if (pos >= size) break;
                                 if (begin[pos] == ksize)  {
                                         memset (print + pos - ksize + 1, 0, ksize);