Source code for submission s878

Go to diff to previous submission

bugs.c

  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int AutomatEsc[1000];
  5. char Vstup[3000000];
  6. char OutP[3000000];
  7. char Bugr[2000];
  8.  
  9. int main() {
  10. int T;
  11. char *Bug;
  12. int BL,VL;
  13. int Pos;
  14. int AP;
  15. int OldAP;
  16. int i;
  17. char c;
  18. int WO;
  19. int Found;
  20. int OutPLen;
  21.  
  22. while (scanf("%d",&T) == 1) {
  23. gets(Bugr);
  24. Bug = Bugr+1;
  25. BL = strlen(Bug);
  26. AutomatEsc[0] = -1;
  27. AP = -1;
  28. for (Pos = 1;Pos < BL;Pos++) {
  29. AP++;
  30. while ((*(Bug+AP) != *(Bug+Pos)) && (AP>=0)) {
  31. AP = AutomatEsc[AP];
  32. };
  33. AutomatEsc[Pos]=AP;
  34. };
  35. //for (Pos = 0;Pos < BL;Pos++) printf("%d ",AutomatEsc[Pos]);
  36. //printf("\n");
  37. while (T-->0) {
  38. gets(Vstup);
  39. VL = strlen(Vstup);
  40. OutPLen = 0;
  41. AP = -1;
  42. for (Pos = 0;Pos < VL;Pos++) {
  43. c = *(Vstup+Pos);
  44. OldAP = AP;
  45. while ((*(Bug+AP+1) != c) && (AP >=0)) {
  46. //printf("ESC %d %d\n",AP,AutomatEsc[AP]);
  47. AP = AutomatEsc[AP];
  48. };
  49. if (AP == -1) {
  50. if (c == *Bug) AP = 0;
  51. } else AP++;
  52. //printf("%d %d %c-",AP,OldAP,c);
  53. if (AP == BL-1) {
  54. AP = -1;
  55. WO = (BL>OutPLen)?OutPLen:BL;
  56. Pos = Pos-WO+1;
  57. OutPLen = OutPLen-WO;
  58. while (WO>0) {
  59. WO--;
  60. *(Vstup+Pos+WO) = *(OutP+OutPLen+WO);
  61. };
  62. Pos--;
  63. //printf("ESC %s\n",(Vstup+Pos));
  64. } else {
  65. if (OldAP != -1) {
  66. WO = OldAP - AP;
  67. if (AP == -1) WO--;
  68. for (i=0;i<=WO;i++) {
  69. *(OutP+(OutPLen++))=*(Bug+i);
  70. };
  71. };
  72. if (AP == -1) *(OutP+(OutPLen++))=c;
  73. };
  74. //printf("-\n");
  75. };
  76. for (i=0;i<=AP;i++) *(OutP+(OutPLen++))=*(Bug+i);
  77. *(OutP+OutPLen)=0;
  78. //printf("%d %s %s \n",Found,Vstup,OutP);
  79. printf("%s\n",OutP);
  80. };
  81. };
  82. return 0;
  83. };
  84.  

Diff to submission s842

bugs.c

--- c4.s842.cteam048.bugs.c.0.bugs.c
+++ c4.s878.cteam048.bugs.c.0.bugs.c
@@ -38,8 +38,5 @@
                         gets(Vstup);
                         VL = strlen(Vstup);
-                        Found = 1;
-                while (Found !=0) {
                         OutPLen = 0;
-                        Found = 0;
                         AP = -1;
                         for (Pos = 0;Pos < VL;Pos++) {
@@ -56,5 +53,13 @@
                                 if (AP == BL-1) {
                                         AP = -1;
-                                        Found = 1;
+                                        WO = (BL>OutPLen)?OutPLen:BL;
+                                        Pos = Pos-WO+1;
+                                        OutPLen = OutPLen-WO;
+                                        while (WO>0) {
+                                                WO--;
+                                                *(Vstup+Pos+WO) = *(OutP+OutPLen+WO);
+                                        };
+                                        Pos--;
+//printf("ESC %s\n",(Vstup+Pos));
                                 } else {
                                         if (OldAP != -1) {
@@ -71,8 +76,5 @@
                         for (i=0;i<=AP;i++) *(OutP+(OutPLen++))=*(Bug+i);
                         *(OutP+OutPLen)=0;
-                        VL = OutPLen;
-                        for (i=0;i<=VL;i++) *(Vstup+i) = *(OutP+i);
 //printf("%d %s %s \n",Found,Vstup,OutP);
-}
                         printf("%s\n",OutP);
                 };