Go to diff to previous submission
#include <stdio.h> #include <string.h> int AutomatEsc[1000]; char Vstup[3000000]; char OutP[3000000]; char Bugr[2000]; int main() { int T; char *Bug; int BL,VL; int Pos; int AP; int OldAP; int i; char c; int WO; int Found; int OutPLen; Bug = Bugr+1; AutomatEsc[0] = -1; AP = -1; for (Pos = 1;Pos < BL;Pos++) { AP++; while ((*(Bug+AP) != *(Bug+Pos)) && (AP>=0)) { AP = AutomatEsc[AP]; }; AutomatEsc[Pos]=AP; }; //for (Pos = 0;Pos < BL;Pos++) printf("%d ",AutomatEsc[Pos]); //printf("\n"); while (T-->0) { OutPLen = 0; AP = -1; for (Pos = 0;Pos < VL;Pos++) { c = *(Vstup+Pos); OldAP = AP; while ((*(Bug+AP+1) != c) && (AP >=0)) { //printf("ESC %d %d\n",AP,AutomatEsc[AP]); AP = AutomatEsc[AP]; }; if (AP == -1) { if (c == *Bug) AP = 0; } else AP++; //printf("%d %d %c-",AP,OldAP,c); if (AP == BL-1) { AP = -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) { WO = OldAP - AP; if (AP == -1) WO--; for (i=0;i<=WO;i++) { *(OutP+(OutPLen++))=*(Bug+i); }; }; if (AP == -1) *(OutP+(OutPLen++))=c; }; //printf("-\n"); }; for (i=0;i<=AP;i++) *(OutP+(OutPLen++))=*(Bug+i); *(OutP+OutPLen)=0; //printf("%d %s %s \n",Found,Vstup,OutP); }; }; return 0; };
--- 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); };