Advertisement
tane_superior

Untitled

Dec 19th, 2021
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.67 KB | None | 0 0
  1.  
  2.  
  3. #include <string>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <fstream>
  7. #include <iostream>
  8.  
  9. class SuffixNode {
  10. public:
  11. SuffixNode(int index, int x, int y) {
  12. this->index = index;
  13. rank[0] = x;
  14. rank[1] = y;
  15. }
  16.  
  17. int index;
  18. int rank[2];
  19. };
  20.  
  21. int cmp(SuffixNode a, SuffixNode b) {
  22. return (a.rank[0] == b.rank[0]) ? (a.rank[1] < b.rank[1]) : (a.rank[0] < b.rank[0]);
  23. }
  24.  
  25. std::vector<int> buildArray(std::string text) {
  26. std::vector<SuffixNode> sufArr;
  27. std::vector<int> indices;
  28. std::vector<int> result;
  29. for (int i = 0; i < text.size(); i++) {
  30. indices.push_back(0);
  31. sufArr.push_back(SuffixNode(i, text[i] - 'a', ((i + 1) < text.size()) ? (text[i + 1] - 'a') : -1));
  32. }
  33. std::sort(sufArr.begin(), sufArr.end(), cmp);
  34.  
  35. for (int k = 4; k < text.size() * 2; k *= 2) {
  36. int curRank = 0;
  37. int prevRank = sufArr[0].rank[0];
  38. sufArr[0].rank[0] = curRank;
  39. indices[sufArr[0].index] = 0;
  40. for (int i = 1; i < text.size(); i++) {
  41. if (sufArr[i].rank[0] == prevRank && sufArr[i].rank[1] == sufArr[i - 1].rank[1]) {
  42. prevRank = sufArr[i].rank[0];
  43. sufArr[i].rank[0] = curRank;
  44. } else {
  45. prevRank = sufArr[i].rank[0];
  46. curRank++;
  47. sufArr[i].rank[0] = curRank;
  48. }
  49. indices[sufArr[i].index] = i;
  50. }
  51. for (int i = 0; i < text.size(); i++) {
  52. sufArr[i].rank[1] = (sufArr[i].index + k / 2 < text.size()) ? sufArr[indices[sufArr[i].index + k / 2]].rank[0]: -1;
  53. }
  54. std::sort(sufArr.begin(), sufArr.end(), cmp);
  55. }
  56.  
  57. for (auto suf : sufArr)
  58. result.push_back(suf.index);
  59. return result;
  60. }
  61.  
  62.  
  63. std::vector<std::vector<int>> patternSearch(const std::vector<std::string> &patterns, const std::vector<int> &array, std::string text) {
  64. std::vector<std::vector<int>> cheshskieprostitutki;
  65. for (int j = 0; j < patterns.size(); j++) {
  66. std::vector<int> ocurrences;
  67. bool flag = false;
  68. for (int i = 0; i < array.size(); i++) {
  69. if (patterns[j].size() <= text.size() - array[i] && patterns[j] == text.substr(array[i], patterns[j].size())) {
  70. flag = true;
  71. ocurrences.push_back(array[i]);
  72. } else if (flag)
  73. break;
  74. }
  75. std::sort(ocurrences.begin(), ocurrences.end());
  76. cheshskieprostitutki.push_back(ocurrences);
  77. }
  78. return cheshskieprostitutki;//<3333333333333333333333333333333333333333333
  79. }
  80.  
  81. std::vector<std::string> readFile()
  82. {
  83. std::ifstream file("input.txt");
  84. std::vector<std::string> result;
  85. while (file.good()) {
  86. std::string crutch;
  87. std::getline(file, crutch);
  88. if (crutch != "")
  89. result.push_back(crutch);
  90. }
  91. file.close();
  92. return result;
  93. }
  94.  
  95. void printSuffix(std::vector<std::vector<int>> results)
  96. {
  97. for (int i = 0; i < results.size(); i++) {
  98. if(results[i].empty()) {
  99. continue;
  100. }
  101. std::cout << i + 1 << ": ";
  102. for (int j = 0; j < results[i].size(); j++) {
  103. if (j != 0)
  104. std::cout << ", ";
  105. std::cout << results[i][j] + 1;
  106. }
  107. if (i != results.size() - 1)
  108. std::cout << '\n';
  109. }
  110. return;
  111. }
  112.  
  113. int main() {
  114. std::vector<std::string> lines = readFile();
  115. std::string text = lines[0];
  116. lines.erase(lines.begin());
  117.  
  118. std::vector<int> sufArr = buildArray(text);
  119. std::vector<std::vector<int>> ocurrences = patternSearch(lines, sufArr, text);
  120.  
  121. printSuffix(ocurrences);
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement