Source code for submission s1256

Go to diff to previous submission

bugs.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. char bug[2000];
  6. char line[3000000];
  7. char lineo[3000000];
  8. int lineop;
  9. int stack[3000000];
  10. int stackp;
  11.  
  12. void push(int val)
  13. {
  14. stack[stackp++] = val;
  15. }
  16.  
  17. int pop()
  18. {
  19. return stack[--stackp];
  20. }
  21.  
  22. int top()
  23. {
  24. return stack[stackp-1];
  25. }
  26.  
  27. int main(int argc, char **argv)
  28. {
  29. int lines, linel, i, bugl, f, nostart;
  30. while (1) {
  31. scanf("%d ", &lines);
  32. if (feof(stdin))
  33. break;
  34. gets(bug);
  35. bugl = strlen(bug);
  36. while (lines--) {
  37. stackp=0;
  38. lineop = 0;
  39. gets(line);
  40. linel=strlen(line);
  41. nostart = 0;
  42. for (i=0; i<linel;i++) {
  43. lineo[lineop++] = line[i];
  44. lineo[lineop] = 0;
  45. sem:
  46. f = 0;
  47. if (nostart==0 && bug[0] == line[i]) {
  48. //printf("Start %d %s %s\n", i, lineo, line+i);
  49. push(1);
  50. f = 1;
  51. }
  52. else if (stackp && bug[top()] == line[i]) {
  53. //printf("Cont %d %d %s %s\n", i, top(), lineo, line+i);
  54. push(pop()+1);
  55. if (top() == bugl) {
  56. lineop -= bugl;
  57. pop();
  58. lineo[lineop] = 0;
  59. //printf("OK %s %s\n", lineo, line+i);
  60. }
  61. f = 1;
  62. nostart = 0;
  63. }
  64. else if (!f) {
  65. if (stackp) {
  66. //printf("Fail %d %d %s %s\n", i, top(), lineo, line+i);
  67. int rem = pop();
  68. lineop -= 1;
  69. i -= 1;
  70. nostart = 1;
  71. goto sem;
  72. continue;
  73. }
  74. //else printf("FailE %d %d %s %s\n", i, top(), lineo, line+i);
  75. }
  76. }
  77. lineo[lineop] = 0;
  78. printf("%s\n", lineo);
  79. }
  80. }
  81. return 0;
  82. }
  83.  

Diff to submission s1051

bugs.c

--- c4.s1051.cteam129.bugs.c.0.bugs.c
+++ c4.s1256.cteam129.bugs.c.0.bugs.c
@@ -27,5 +27,5 @@
 int main(int argc, char **argv)
 {
-        int lines, linel, i, bugl, f;
+        int lines, linel, i, bugl, f, nostart;
         while (1) {
                 scanf("%d ", &lines);
@@ -39,20 +39,39 @@
                         gets(line);
                         linel=strlen(line);
-                        for (i=0; i<linel; i++) {
+                        nostart = 0;
+                        for (i=0; i<linel;i++) {
                                 lineo[lineop++] = line[i];
+                                lineo[lineop] = 0;
+                                sem:
                                 f = 0;
-                                if (stackp && bug[top()] == line[i]) {
+                                if (nostart==0 && bug[0] == line[i]) {
+                                        //printf("Start %d %s %s\n", i, lineo, line+i);
+                                        push(1);
+                                        f = 1;
+                                }
+                                else if (stackp && bug[top()] == line[i]) {
+                                        //printf("Cont %d %d %s %s\n", i, top(), lineo, line+i);
                                         push(pop()+1);
                                         if (top() == bugl) {
                                                 lineop -= bugl;
                                                 pop();
+                                                lineo[lineop] = 0;
+                                                //printf("OK %s %s\n", lineo, line+i);
                                         }
                                         f = 1;
+                                        nostart = 0;
                                 }
-                                if (bug[0] == line[i]) {
-                                        push(1);
-                                        f = 1;
+                                else if (!f) {
+                                        if (stackp) {
+                                                //printf("Fail %d %d %s %s\n", i, top(), lineo, line+i);
+                                                int rem = pop();
+                                                lineop -= 1;
+                                                i -= 1;
+                                                nostart = 1;
+                                                goto sem;
+                                                continue;
+                                        }
+                                        //else printf("FailE %d %d %s %s\n", i, top(), lineo, line+i);
                                 }
-                                if (!f) stackp = 0;
                         }
                         lineo[lineop] = 0;