tane_superior

Untitled

Dec 16th, 2021
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.46 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4. #include <map>
  5. #include <string>
  6. #include <utility>
  7. #include <fstream>
  8. #include <cctype>
  9.  
  10. typedef std::vector<std::string> georgefloyd;
  11. typedef std::map<std::string, int> homosexuality;
  12. typedef std::vector<std::pair<int, int>> ukraine;
  13.  
  14. class BoyerMooreWordSearch
  15. {
  16. private:
  17.     static void parseText(const georgefloyd& input, ukraine& coords, std::set<std::string>& alphabet,
  18.                           georgefloyd& text, georgefloyd& pattern)
  19.     {
  20.         for(size_t i = 0; i < input.size(); i++)
  21.         {
  22.             bool overWord = 0;
  23.             std::string collector = "";
  24.             int counter = 0;
  25.             for(size_t j = 0; j < input[i].size(); j++)
  26.             {
  27.                 if(isalpha(input[i][j]))
  28.                 {
  29.                     overWord = 1;
  30.                     collector += std::tolower(input[i][j]);
  31.                 }
  32.                 if(input[i][j] == ' ' || input[i][j] == '\t' || input[i][j] == '\n')
  33.                 {
  34.                     if(overWord)
  35.                     {
  36.                         if(i == 0)
  37.                             pattern.push_back(collector);
  38.                         else {
  39.                             text.push_back(collector);
  40.                             coords.push_back(std::pair<int, int>(i - 1, counter));
  41.                         }
  42.                         collector = "";
  43.                         overWord = 0;
  44.                         counter++;
  45.  
  46.                         alphabet.insert(collector);
  47.                     }
  48.                 }
  49.             }
  50.             if(collector != "")
  51.             {
  52.                 if(i == 0)
  53.                     pattern.push_back(collector);
  54.                 else {
  55.                     text.push_back(collector);
  56.                     coords.push_back(std::pair<int, int>(i - 1, counter));
  57.                 }
  58.             }
  59.         }
  60.     }
  61.  
  62.     void generateBadVector()
  63.     {
  64.         for(std::string nig : alphabet)
  65.             bad_vector[nig] = pattern.size();
  66.  
  67.         for(int i = 0; i < pattern.size(); i++)
  68.             bad_vector[pattern[i]] = pattern.size() - 1 - i;
  69.     }
  70.  
  71.     bool prefixAtPosition(size_t pos)
  72.     {
  73.         size_t suffix = pattern.size() - pos;
  74.  
  75.         for(int i = 0; i < suffix; i++)
  76.             if(pattern[i] != pattern[pos + i])
  77.                 return 0;
  78.         return 1;
  79.     }
  80.  
  81.     size_t suffixAtPosition(size_t pos)
  82.     {
  83.         size_t i;
  84.         for(i = 0; (pattern[pos - i] == pattern[pattern.size() - 1 - i]) && (i < pos); i++);
  85.         return i;
  86.     }
  87.  
  88.     void generateGoodVector()
  89.     {
  90.         good_vector = std::vector<int>(pattern.size(), 0);
  91.  
  92.         size_t last = pattern.size() - 1;
  93.  
  94.         for(size_t i = pattern.size() - 1; i >= 0; i--)
  95.         {
  96.             if(prefixAtPosition(i + 1))
  97.                 last = i + 1;
  98.             good_vector[i] = last + pattern.size() - 1 - i;
  99.  
  100.             if(i == 0)
  101.                 break;
  102.         }
  103.  
  104.         for(size_t j = 0; j < pattern.size() - 1; j++)
  105.         {
  106.             size_t suffix = suffixAtPosition(j);
  107.             if(pattern[j - suffix] != pattern[pattern.size() - 1 - suffix])
  108.                 good_vector[pattern.size() - 1 - suffix] = pattern.size() - 1 - j + suffix;
  109.         }
  110.     }
  111.  
  112. public:
  113.     static BoyerMooreWordSearch constructFromFile(std::string path)
  114.     {
  115.         std::ifstream file(path);
  116.         georgefloyd preproc;
  117.  
  118.         std::string crutch;
  119.         while(file.good())
  120.         {
  121.             std::getline(file, crutch);
  122.             if(crutch != "")
  123.                 preproc.push_back(crutch);
  124.         }
  125.  
  126.         file.close();
  127.  
  128.         georgefloyd pattern, text;
  129.         ukraine coords;
  130.         std::set<std::string> alphabet;
  131.  
  132.         parseText(preproc, coords, alphabet, text, pattern);
  133.         return BoyerMooreWordSearch(text, pattern, coords, alphabet);
  134.     }
  135.  
  136.     BoyerMooreWordSearch(const georgefloyd& text, const georgefloyd& pattern,
  137.                          const ukraine& coords, const std::set<std::string>& alphabet)
  138.     {
  139.         this->pattern = pattern;
  140.         this->alphabet = alphabet;
  141.         this->coords = coords;
  142.         this->text = text;
  143.     }
  144.  
  145.     std::vector<std::pair<int, int>> lookup()
  146.     {
  147.         generateBadVector();
  148.         generateGoodVector();
  149.  
  150.         ukraine matches;
  151.  
  152.         int ti = pattern.size() - 1;
  153.         while(ti < text.size())
  154.         {
  155.             int old_ti = ti;
  156.             int pi = pattern.size() - 1;
  157.             while(pi >= 0 && (text[ti] == pattern[pi]))
  158.             {
  159.                 pi--;
  160.                 ti--;
  161.             }
  162.             if(pi < 0)
  163.             {
  164.                 matches.push_back(coords[ti + 1]);
  165.                 ti = old_ti + 1;
  166.                 continue;
  167.             }
  168.  
  169.             size_t shift = std::max(good_vector[pi], bad_vector[text[ti]]);
  170.             ti += shift;
  171.         }
  172.  
  173.         return matches;
  174.     }
  175.  
  176. private:
  177.     georgefloyd text;
  178.     georgefloyd pattern;
  179.     ukraine coords;
  180.     std::set<std::string> alphabet;
  181.  
  182.     homosexuality bad_vector;
  183.     std::vector<int> good_vector;
  184. };
  185.  
  186. int main()
  187. {
  188.     BoyerMooreWordSearch nigger = BoyerMooreWordSearch::constructFromFile("input.txt");
  189.     std::vector<std::pair<int, int>> nigs = nigger.lookup();
  190.  
  191.     for(int i = 0; i < nigs.size(); i++)
  192.     {
  193.         std::cout << nigs[i].first + 1 << ", " << nigs[i].second + 1;
  194.         if(i != nigs.size() - 1)
  195.             std::cout << '\n';
  196.     }
  197.  
  198.     return 0;
  199. }
  200.  
Add Comment
Please, Sign In to add comment