Advertisement
Adam_mz_

CONTEST#2 TASK#2

Dec 19th, 2021
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.47 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. #include <fstream>
  4. #include <string>
  5. #include <vector>
  6. #include <cstring>
  7. #include <algorithm>
  8. #include <sstream>
  9.  
  10.  
  11. struct Suffix
  12. {
  13.     int index;
  14.     int rank[2];
  15. };
  16.  
  17. int compare(struct Suffix a, struct Suffix b)
  18. {
  19.     return (a.rank[0] == b.rank[0]) ? (a.rank[1] < b.rank[1] ? 1 : 0) :
  20.            (a.rank[0] < b.rank[0] ? 1 : 0);
  21. }
  22.  
  23. std::vector<int> buildSuffixArray(std::string text)
  24. {
  25.     size_t n = text.size();
  26.     std::vector<Suffix> suffixes(n, Suffix());
  27.  
  28.     for (int i = 0; i < n; ++i)
  29.     {
  30.         suffixes[i].index = i;
  31.         suffixes[i].rank[0] = text[i] - 97;
  32.         suffixes[i].rank[1] = ((i + 1) < n) ? (text[i + 1] - 97) : -1;
  33.     }
  34.  
  35.     sort(suffixes.begin(), suffixes.end(), compare);
  36.  
  37.     std::vector<int> indices(n, 0);
  38.  
  39.     for (int i = 4; i < 2 * n; i = i * 2)
  40.     {
  41.         int rank = 0;
  42.         int previousRank = suffixes[0].rank[0];
  43.         suffixes[0].rank[0] = rank;
  44.         indices[suffixes[0].index] = 0;
  45.  
  46.         for (int j = 1; j < n; ++j)
  47.         {
  48.  
  49.             previousRank = suffixes[j].rank[0];
  50.             suffixes[j].rank[0] = suffixes[j].rank[0] == previousRank &&
  51.                                   suffixes[j].rank[1] == suffixes[j - 1].rank[1] ? rank : ++rank;
  52.  
  53.             indices[suffixes[j].index] = j;
  54.  
  55.  
  56.         }
  57.  
  58.         for (int j = 0; j < n; ++j)
  59.         {
  60.             int nextIndex = suffixes[j].index + i / 2;
  61.             suffixes[j].rank[1] = (nextIndex < n) ? suffixes[indices[nextIndex]].rank[0] : -1;
  62.         }
  63.  
  64.         sort(suffixes.begin(), suffixes.end(), compare);
  65.     }
  66.  
  67.  
  68.     std::vector<int> suffixArray(n, 0);
  69.     for (int i = 0; i < n; ++i)
  70.         suffixArray[i] = suffixes[i].index;
  71.  
  72.     return suffixArray;
  73. }
  74.  
  75. std::vector<int> search(const std::string &text, const std::string &pattern, const std::vector<int> &sufArr)
  76. {
  77.     std::vector<int> matched;
  78.     bool flg = false;
  79.     for (int i : sufArr)
  80.     {
  81.         if (pattern.size() > text.size() - i)
  82.         {
  83.             if (flg)
  84.                 break;
  85.         } else if (pattern == text.substr(i, pattern.size()))
  86.         {
  87.             flg = true;
  88.             matched.push_back(i);
  89.         }
  90.  
  91. //   xaxaxaaaxaxaxaxaxaxaaaxaxaxaaxaxaxaaaxaxaxaaaxaxaxaa
  92.     }
  93.  
  94.     std::sort(matched.begin(), matched.end());
  95.  
  96.     return matched;
  97. }
  98.  
  99.  
  100. std::vector<std::string> readInput(const std::string &path)
  101. {
  102.     std::ifstream file(path);
  103.     std::vector<std::string> arr;
  104.     std::string word;
  105.     while (std::getline(file, word))
  106.         arr.push_back(word);
  107.  
  108.     file.close();
  109.  
  110.     return arr;
  111. }
  112.  
  113.  
  114. std::string suffixArrayTask(const std::string &path)
  115. {
  116. //    std::cout << "Test: " << path;
  117.     std::stringstream ss;
  118.     std::vector<std::string> arr = readInput(path);
  119.     std::vector<int> res;
  120.  
  121.     std::vector<int> suffixArray = buildSuffixArray(arr[0]);
  122.     for (int i = 1; i < arr.size(); ++i)
  123.     {
  124.  
  125.         std::string pattern = arr[i];
  126.         res = search(arr[0], pattern, suffixArray);
  127.         if (!res.empty())
  128.         {
  129.             std::cout << i << ": ";
  130. //            ss << i << ": ";
  131.             for (int j = 0; j < res.size() - 1; ++j)
  132.             {
  133.                 std::cout << res[j] + 1 << ", ";
  134. //                ss << res[j] + 1 << ", ";
  135.             }
  136.             std::cout << res[res.size() - 1] + 1 << "\n";
  137. //            ss << res[res.size() - 1] + 1 << "\n";
  138.         }
  139.     }
  140.  
  141.     return ss.str();
  142. }
  143.  
  144. int main()
  145. {
  146.  
  147.     suffixArrayTask("input.txt");
  148.  
  149.  
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement