A bunch of random code samples
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

55 líneas
1.4 KiB

  1. auto subsequence_boundary(auto start, auto end,auto pred) {
  2. using live_iterator = decltype(start);
  3. using distance_t = std::invoke_result_t<decltype(std::distance<live_iterator>), live_iterator, decltype(end)>;
  4. distance_t distance = std::distance(start, end);
  5. if(distance < 1) {
  6. return start;
  7. }
  8. if(distance == 1) {
  9. return ++start;
  10. }
  11. live_iterator next = start;
  12. ++next;
  13. while(not pred(*start, *next)) {
  14. ++start;
  15. ++next;
  16. if(next == end) return next;
  17. }
  18. return next;
  19. }
  20. auto longest_matching_subsequence(auto start, auto end, auto pred) {
  21. using live_iterator = decltype(start);
  22. using distance_t = std::invoke_result_t<decltype(std::distance<live_iterator>), live_iterator, decltype(end)>;
  23. live_iterator current = start;
  24. struct {
  25. live_iterator best_s;
  26. live_iterator best_e;
  27. } results;
  28. results.best_s = start;
  29. results.best_e = start;
  30. distance_t best_length = 0;
  31. while(current != end) {
  32. live_iterator next = subsequence_boundary(current, end, pred);
  33. distance_t subsequence_length = std::distance(current, next);
  34. if(subsequence_length > best_length) {
  35. results.best_s = current;
  36. results.best_e = next;
  37. best_length = subsequence_length;
  38. }
  39. current = next;
  40. }
  41. return results;
  42. }
  43. TEST_CASE("Subsequence") {
  44. std::vector<int> list = {0,1,2,3,4,5,0,1,0,2,5,8,7};
  45. auto [s,e] = longest_matching_subsequence(list.begin(), list.end(), std::greater<int>{});
  46. REQUIRE(std::distance(s,e) == 6);
  47. }