Advertisement
Guest User

Untitled

a guest
Nov 15th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.20 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdbool.h>
  5. #include <memory.h>
  6.  
  7. FILE *f;
  8. size_t  lengthOfTemplate = 0,
  9. lengthOfBuffer = 0;
  10.  
  11. void getLine(char* dst, bool isTemplate) {
  12.     char currentSymbol;
  13.     size_t currentLength = 0;
  14.     while ((currentSymbol = (char)getchar()) != '\n') {
  15.         dst[currentLength++] = currentSymbol;
  16.  
  17.         if (!isTemplate && currentLength == lengthOfTemplate) {
  18.             lengthOfBuffer = lengthOfTemplate;
  19.             return;
  20.         }
  21.     }
  22.  
  23.     if (isTemplate) {
  24.         lengthOfTemplate = currentLength;
  25.     }
  26.     else {
  27.         lengthOfBuffer = currentLength;
  28.     }
  29. }
  30.  
  31. void getMoves(size_t* moves, char* pattern) {
  32.     for (size_t i = lengthOfTemplate - 2; i > 0; i--) {
  33.         if (moves[(int)pattern[i]] == lengthOfTemplate) {
  34.             moves[(int)pattern[i]] = lengthOfTemplate - i - 1;
  35.         }
  36.     }
  37.     if (moves[(int)pattern[0]] == lengthOfTemplate) {
  38.         moves[(int)pattern[0]] = lengthOfTemplate - 1;
  39.     }
  40. }
  41. size_t getCurrentMove(char* pattern, char* buffer, size_t* moves, size_t currentIndex) {
  42.     for (size_t i = lengthOfTemplate - 1; i > 0; i--) {
  43.         printf("%zu ", currentIndex--);
  44.         if (buffer[i] != pattern[i]) {
  45.             return moves[(int)buffer[lengthOfTemplate - 1]];
  46.         }
  47.     }
  48.     printf("%zu ", currentIndex);
  49.     if (buffer[0] != pattern[0]) {
  50.         return moves[(int)pattern[0]];
  51.     }
  52.     else    return lengthOfTemplate;
  53. }
  54.  
  55. void startAlgorithm(char* pattern, char* buffer, size_t* moves) {
  56.     size_t currentIndex = lengthOfTemplate;
  57.  
  58.     while (1) {
  59.         size_t currentMove = getCurrentMove(pattern, buffer, moves, currentIndex);
  60.  
  61.         if (currentMove == lengthOfTemplate) {
  62.             for (size_t i = 0; i < lengthOfTemplate; i++) {
  63.                 currentIndex++;
  64.                 if (buffer[i] = (char)getchar()) {
  65.                     if (buffer[i] != '\n') {
  66.                         continue;
  67.                     }
  68.                     else {
  69.                         free(pattern);
  70.                         free(buffer);
  71.                         system("pause");
  72.                         exit(0);
  73.                     }
  74.                 }
  75.                 else {
  76.                     free(pattern);
  77.                     free(buffer);
  78.                     system("pause");
  79.                     exit(0);
  80.                 }
  81.             }
  82.         }
  83.         else {
  84.             memcpy(buffer, buffer + currentMove, lengthOfTemplate - currentMove);
  85.             for (size_t i = lengthOfTemplate - currentMove; i < lengthOfTemplate; i++) {
  86.                 currentIndex++;
  87.                 if (buffer[i] = (char)getchar()) {
  88.                     if (buffer[i] != '\n') {
  89.                         continue;
  90.                     }
  91.                     else {
  92.                         free(pattern);
  93.                         free(buffer);
  94.                         system("pause");
  95.                         exit(0);
  96.                     }
  97.                 }
  98.                 else {
  99.                     free(pattern);
  100.                     free(buffer);
  101.                     exit(0);
  102.                 }
  103.             }
  104.         }
  105.     }
  106. }
  107.  
  108. int main() {
  109.     char* pattern = (char*)calloc(17, sizeof(char));
  110.     if (!pattern) {
  111.         printf("No memory");
  112.         system("pause");
  113.         return 0;
  114.     }
  115.     else {
  116.         getLine(pattern, true);
  117.         if (lengthOfTemplate == 0) {
  118.             printf("bad input");
  119.             free(pattern);
  120.             system("pause");
  121.             return 0;
  122.         }
  123.     }
  124.  
  125.     char* buffer = (char*)calloc(lengthOfTemplate + 1, sizeof(char));
  126.     if (!pattern) {
  127.         printf("No memory");
  128.         system("pause");
  129.         return 0;
  130.     }
  131.     else {
  132.         getLine(buffer, false);
  133.         if (lengthOfBuffer < lengthOfTemplate) {
  134.             free(pattern);
  135.             free(buffer);
  136.             system("pause");
  137.             return 0;
  138.         }
  139.     }
  140.  
  141.     size_t moves[256];
  142.     for (size_t i = 0; i < 256; i++) {
  143.         moves[i] = lengthOfTemplate;
  144.     }
  145.     getMoves(moves, pattern);
  146.  
  147.     startAlgorithm(pattern, buffer, moves);
  148.  
  149.     system("pause");
  150.     return 0;
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement