• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Cyklicznie równoważne sufiksy danych słów

Cloud VPS
0 głosów
348 wizyt
pytanie zadane 24 czerwca 2015 w Algorytmy przez krecik1334 Maniak (58,390 p.)

Załóżmy, że mamy sobie słowa A i B, oba o długości n. Naszym zadaniem jest odpowiedzieć na zapytanie, czy są w nich takie podsłowa (koniecznie sufiksy, słowa wyjściowe też są podsłowami), że są one sobie cyklicznie równoważne. Przy czym zakładamy, że cyklicznie równoważne są takie słowa W1, W2, że W1 = XY a W2 = YX, gdzie X i Y są to słowa niepuste. Jak byście to rozkminili? Zakładamy, że prefiksy do słów A i B są sobie równe (bardzo ważne).

1 odpowiedź

0 głosów
odpowiedź 26 czerwca 2015 przez Gariw Użytkownik (920 p.)
Nie wiem czy dobrze zrozumiałem to zadanie ale z tego co wywnioskowałem to chyba będziesz potrzebował jakiegoś słownika(bazy słów). Z porównywaniem ciągu znaków nie ma większego  problemu ale sprawdzenie czy to jest logiczne słowo wymaga jakiejś bazy. Nie rozumiem tego porównania W1 = XY i W2 = YX. Czy oznacza ono, że przyrostek W1 to przedrostek W2? Co do kodu jeśli znasz długość przedrostka lub przyrostka (zakładające, że słowa, przyrostki i przedrostki tych słów maja równą długość znaków) to porównanie ciągu znaków nie jest zbyt skomplikowane, wystarczy sprawdzać literka po literce.
komentarz 26 czerwca 2015 przez krecik1334 Maniak (58,390 p.)
Szukam słów postaci XYZ i XZY, gdzie Y i Z są niepuste. Potrzebuję to mieć w złożoności szybszej niż O(n^2) gdzie n = liczba znaków w słowie, kwadratowe rozwiązanie posiadam.
komentarz 29 czerwca 2015 przez Gariw Użytkownik (920 p.)
edycja 29 czerwca 2015 przez Gariw

Tak więc z tego co mówisz to:

W1 = W2 = n

W1 = XYZ i W2 = XZY

ZY = n – X

Przyjmijmy, że U to pierwsza litera po przedrostku X(czyli X + 1).

Po wykonaniu zmienna zm będzie zawierała długość Y.

int g = 0, j = 1, i = 0, zm = 1;
while(1)
    {
        if(j + U +1 == strlen(w2))
        {
            break;
        }
        if(w1[U+g] == w2[U+j])
        {

            for(i = U+j+1 ; i < strlen(w2); i++)
            {
                g++;
                if(w1[U+g] == w2[i])
                {
                    zm++;
                    if(i +1 == strlen(w2))
                        break;
                }
                else
                {
                    g = 0;
                    zm = 1;
                    j++;
                    break;
                }
            }
        }
        else
        {
            j++;
        }
    }

Kod nie jest doskonały, zadziała nawet dla nielogicznych słów, ale mam nadzieję, że pomogłem. 

 

Podobne pytania

0 głosów
1 odpowiedź 1,347 wizyt
0 głosów
1 odpowiedź 591 wizyt
pytanie zadane 4 lutego 2023 w C i C++ przez pasjonat_algorytmiki Pasjonat (19,540 p.)
0 głosów
1 odpowiedź 930 wizyt
pytanie zadane 15 stycznia 2021 w Egzaminy zawodowe przez bumbumjol Nowicjusz (120 p.)

93,485 zapytań

142,417 odpowiedzi

322,765 komentarzy

62,898 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...