Jeśli liczby są naturalne a ciągi mogą być długie, lepiej IMO zastosować zliczanie z sortowaniem. Dodając element do listy/wektora/czegoś, dodajesz tak by ciąg był rosnący. Każdy węzeł trzyma liczbę danych wartości. Przykładowo dodając do wektora/listy 1,2,5,5,3, budujesz kolejno coś takiego:
1(1)
1(1), 2(1)
1(1), 2(1), 5 (1)
1(1), 2(1), 5 (2)
1(1), 2(1), 3(1), 5 (2)
Dla 1,6,2,8,4,5,3,5:
1(1),
1(1), 6(1)
1(1), 2(1), 6(1)
1(1), 2(1), 6(1), 8(1)
1(1), 2(1), 4(1), 6(1), 8(1)
1(1), 2(1), 4(1), 5(1), 6(1), 8(1)
1(1), 2(1), 3(1), 4(1), 5(1), 6(1), 8(1)
1(1), 2(1), 3(1), 4(1), 5(2), 6(1), 8(1)
Następnie porównujesz listy kolejno i przy pierwszym “braku”, wiesz że nie jest podzbiorem.
Generalnie rozwiązanie każdego problemu - szczególnie takiego abstrakcyjnego - jest silnie zależne od typu i probabilistycznego rozkładu danych, na których będziesz operował. Bo o ile na olimpiadach często musisz działać w miarę wydajnie zawsze, w rzeczywistych zastosowaniach w większości przypadków masz pewien wzorzec tego, co przetwarzasz (wiesz jakie są najbardziej prawdopodobne wartości). I pod ten wzorzec tworzysz/optymalizujesz algorytm i struktury danych.