Source code for submission s1145

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. }
  82. pos++;
  83. }
  84. /*
  85. for (int i = 0; i < size; i++)
  86. printf ("%d ", print[i]);
  87. printf ("\n");
  88. */
  89. for (int i = 0; i < size; i++)
  90. if (print[i])
  91. printf ("%c", line[i]);
  92. printf("\n");
  93. }
  94. }
  95.  
  96. return 0;
  97. }

Diff to submission s1020

bugs.cpp

--- c4.s1020.cteam010.bugs.cpp.0.bugs.cpp
+++ c4.s1145.cteam010.bugs.cpp.0.bugs.cpp
@@ -19,8 +19,4 @@
                         gets (line);
                         int size = strlen (line);
-                        if (size == 0) {
-                                printf ("\n");
-                                continue;
-                        }
                         
                         //printf ("%s\n", line);
@@ -66,4 +62,5 @@
                         memset (print, 1, sizeof (print));
                         for ( ; ;) {
+                                if (pos == size) break;
                                 if (begin[pos] == ksize)  {
                                         memset (print + pos - ksize + 1, 0, ksize);
@@ -84,5 +81,4 @@
                                 }
                                 pos++;
-                                if (pos == size) break;
                         }
                         /*