Advertisement
Sanlover

Untitled

Nov 10th, 2020
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.86 KB | None | 0 0
  1. #include <vector>
  2. #include <string>
  3. #include <iostream>
  4. #include <map>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. bool comparator(const string& first, const string& second)
  10. {
  11. if (first.size() > second.size())
  12. return true;
  13. else
  14. return false;
  15. }
  16. int main()
  17. {
  18. vector<string> words;
  19. vector<string> table;
  20. table.push_back("abdc");
  21. table.push_back("abd");
  22. table.push_back("aasdasdsabd");
  23. table.push_back("aasbdsdf");
  24.  
  25. sort(table.begin(), table.end(), comparator);
  26.  
  27. size_t maxSize = table[0].size();
  28.  
  29. for (size_t wordSizeCounter = 0; wordSizeCounter < maxSize; wordSizeCounter++) // Здесь мы выбираем размера слова, которое будем составлять и, которое будем исктать
  30. {
  31. size_t currentSize = wordSizeCounter + 1; // Поскольу начинаем с нуля
  32. string wordWeSearch; // будущее слово
  33. for (size_t rowMakingIndex = 0; rowMakingIndex < table.size(); rowMakingIndex++) // номер строки, в которой будем выбирать слово, котрое будем искать
  34. {
  35. if (currentSize <= table[rowMakingIndex].size()) // Если размер слово, которое мы ходим создать для поиска НЕ БОЛЬШЕ, чем длина строки, в которой будем выбирать слово, то
  36. {
  37. for (size_t rightBorder = currentSize - 1; rightBorder < table[rowMakingIndex].size(); rightBorder++) // Мы выбираем i = размеру слова, и обрезаем слово с [i-размер] позиции, до [i]
  38. {
  39. wordWeSearch = table[rowMakingIndex].substr(rightBorder - currentSize + 1, currentSize); // Как раз вырезаем
  40. size_t counterOfCollisions = 1; // Если слово выбрали, то уже было одно повторение
  41. size_t rowWeMadeIn = rowMakingIndex; // Запомнили номер строки, из которой взяли слово, которое ищем
  42.  
  43. bool isFind = true; // Для быстродействия
  44. for (size_t rowWeSearchingAt = 0; rowWeSearchingAt < table.size() && isFind; rowWeSearchingAt++) // Бегаем по всем строкам
  45. {
  46. if (rowWeSearchingAt != rowWeMadeIn) // Если это НЕ ряд, в котором мы взяли слово для поиска, то
  47. {
  48. if (table[rowWeSearchingAt].find(wordWeSearch) != string::npos) // Если мы находим слово в этом ряду
  49. {
  50. counterOfCollisions++; // Прибавляем количество коллизий
  51. if (counterOfCollisions > wordWeSearch.size()) // Если кол-во коллизий уже больше, чем размер нашего слова, то искать дальше смысла нет
  52. {
  53. isFind = false; // Завершаем поиск по строкам, ибо уже колллизий больше
  54. break;
  55. }
  56. }
  57. }
  58. }
  59. if (counterOfCollisions == wordWeSearch.size()) // Если количество коллизий по окончании поиска коллизий == размеру нашег ослова
  60. {
  61. bool alreadyInTheVocabulary = true; // То ищем его в векторе
  62. for (auto& it : words) // поиск
  63. if (it == wordWeSearch) // Если такой есть
  64. {
  65. alreadyInTheVocabulary = false; // то мы говорим об этом
  66. break;
  67. }
  68. if (alreadyInTheVocabulary) // Если по окончании, не нашлось, то добавляем
  69. words.push_back(wordWeSearch);
  70. }
  71. }
  72. }
  73. else
  74. {
  75. break;
  76. }
  77. }
  78. }
  79.  
  80. for (auto& it : words)
  81. cout << "Word = " << it << " | Collisions = " << it.size() << endl;
  82. return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement