Advertisement
agul

20140529 :: Strings

May 29th, 2014
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.52 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. const int kMaxStringLength = 5000;
  6. const int kMaxBracketLength = 10;
  7.  
  8. void output(FILE * out, char * msg) {
  9.     fprintf(out, "%s\n", msg);
  10. }
  11.  
  12. char * inputStr(FILE * in, int buffer) {
  13.     char * ret = (char *)malloc(buffer * sizeof(char));
  14.     fgets(ret, buffer, in);
  15.     if (ret[strlen(ret) - 1] == '\n') {
  16.         ret[strlen(ret) - 1] = '\0';
  17.     }
  18.     return ret;
  19. }
  20.  
  21. void process(char ** str, char * op, char * cl) {
  22.     int ls = strlen(*str) + 1;
  23.     int size = ls * sizeof(int);
  24.  
  25.     int * opPos = (int *)malloc(size);
  26.     char * strOffset = *str;
  27.     int opPosCnt = 0;
  28.     while ((strOffset = strstr(strOffset, op)) != NULL) {
  29.         opPos[opPosCnt++] = strOffset - *str + strlen(op) - 1;
  30.         ++strOffset;
  31.     }
  32.  
  33.     int * clPos = (int *)malloc(size);
  34.     strOffset = *str;
  35.     int clPosCnt = 0;
  36.     while ((strOffset = strstr(strOffset, cl)) != NULL) {
  37.         clPos[clPosCnt++] = strOffset - *str;
  38.         ++strOffset;
  39.     }
  40.  
  41.     int * badPositions = (int *)malloc(size);
  42.     memset(badPositions, 0, size);
  43.     int * stack = (int *)malloc(size);
  44.     int stackTop = 0;
  45.     for (int i = 0, j = 0; i < opPosCnt || j < clPosCnt; ) {
  46.         if (i < opPosCnt && opPos[i] >= clPos[j] || i == opPosCnt) {
  47.             if (stackTop == 0) {
  48.                 ++j;
  49.             } else {
  50.                 badPositions[stack[--stackTop] + 1 - strlen(op)] = 1;
  51.                 badPositions[clPos[j++] + strlen(cl)] = -1;
  52.                 while (i < opPosCnt && opPos[i] < clPos[j]) {
  53.                     ++i;
  54.                 }
  55.             }
  56.         } else {
  57.             stack[stackTop++] = opPos[i++];
  58.         }
  59.     }
  60.     int curBalance = 0;
  61.     int curPos = 0;
  62.     for (int i = 0; i < ls; ++i) {
  63.         curBalance += badPositions[i];
  64.         if (curBalance == 0) {
  65.             (*str)[curPos++] = (*str)[i];
  66.         }
  67.     }
  68.     (*str)[curPos] = '\0';
  69.  
  70.     free(stack);
  71.     free(badPositions);
  72.     free(opPos);
  73.     free(clPos);
  74. }
  75.  
  76. int main() {
  77.     FILE * in = fopen("input.txt", "r");
  78.     FILE * out = fopen("output.txt", "w");
  79.  
  80.     output(out, "Enter string:");
  81.     char * str = inputStr(in, kMaxStringLength);
  82.     output(out, "Enter opening bracket:");
  83.     char * op = inputStr(in, kMaxBracketLength);
  84.     output(out, "Enter closing bracket:");
  85.     char * cl = inputStr(in, kMaxBracketLength);
  86.     process(&str, op, cl);
  87.     output(out, str);
  88.  
  89.     free(op);
  90.     free(cl);
  91.     free(str);
  92.     fclose(in);
  93.     fclose(out);
  94.     return 0;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement