infoarena

infoarena - concursuri, probleme, evaluator, articole => Arhiva de probleme => Subiect creat de: Adrian Diaconu din Octombrie 10, 2007, 00:35:34



Titlul: 554 Superstring
Scris de: Adrian Diaconu din Octombrie 10, 2007, 00:35:34
Aici puteţi discuta despre problema Superstring (http://infoarena.ro/problema/superstring).


Titlul: Răspuns: 554 Superstring
Scris de: Bogdan-Alexandru Stoica din Octombrie 10, 2007, 12:34:59
S1 poate fi inclus in S2? (sau vice-versa)


Titlul: Răspuns: 554 Superstring
Scris de: Adrian Diaconu din Octombrie 10, 2007, 22:24:01
Da


Titlul: Răspuns: 554 Superstring
Scris de: Florian Marcu din Octombrie 24, 2007, 16:06:40
Cam ce complexitate ar trebui sa aiba algoritmul? Am ceva in genu O ( N*N) + O (M*M) (unde m, n sunt lungimile celor doua siruri), si iau TLE.  :'( Un hint... ceva?


Titlul: Răspuns: 554 Superstring
Scris de: Andrei Grigorean din Octombrie 24, 2007, 16:19:36
O(N+M) folosind algoritmul Knuth-Morris-Pratt pentru potrivirea sirurilor.


Titlul: Răspuns: 554 Superstring
Scris de: Airinei Adrian din Octombrie 24, 2007, 16:22:44
Sau tot O(N+M) folosind hash-uri  :D


Titlul: Răspuns: 554 Superstring
Scris de: Andrei Grigorean din Octombrie 24, 2007, 20:13:39
E mai elegant si mai sigur cu KMP. In plus, nu toate problemele la care ai nevoie de KMP sau de functia prefix a unui sir se pot rezolva cu hash-uri, asa ca nu strica sa inveti ceva nou.

La problema asta insa merg hash-urile de minune :P.


Titlul: Răspuns: 554 Superstring
Scris de: Cezar Mocan din Octombrie 29, 2007, 20:49:54
Imi dati si mie ceva idei cei care ati facut cu hash va rog... ca nu iese nicicum...  :fighting:


Titlul: Răspuns: 554 Superstring
Scris de: Airinei Adrian din Octombrie 30, 2007, 11:17:28
Trebuie sa faci o functie de hash buna, de exemplu consideri un sir de litere mici un numar in baza 26 si il calculezi modulo un numar prim mare (sau poti calcula modulo 2 numere prime pentru siguranta). Dupa ce iti iese cu hash-uri sa faci si KMP, ambele sunt bine de stiut  :thumbup:


Titlul: Răspuns: 554 Superstring
Scris de: Cezar Mocan din Octombrie 30, 2007, 16:15:37
Pai asa fac... adica eu consider in baza 100 (cred   :-k)... dar daca fac cu % atunci imi iese din timp. Asa ca fac cu & (2^31-1)... si asa intra in timp... dar daca nu fac verificarea iau incorect, si daca verific iau TLE.  #-o


Titlul: Răspuns: 554 Superstring
Scris de: Airinei Adrian din Octombrie 30, 2007, 17:01:35
Vezi cu baza 29 daca iti merge, nu cred ca e prea bine sa aiba divizori comuni baza si numarul care faci modulo.


Titlul: Răspuns: 554 Superstring
Scris de: Andrei Grigorean din Octombrie 30, 2007, 19:37:42
Hash-urile astea te pot scoate din incurcatura de multe ori. Eu personal nu stiu mai deloc hash-uri, insa astronomy de exemplu a luat aur la BOI multumita lor.


Titlul: Răspuns: 554 Superstring
Scris de: Bondane Cosmin din Ianuarie 05, 2008, 23:11:11
Trebuie optimizat ceva ? Am aplicat de doua ori functia KMP, dar iau TLE.


Titlul: Răspuns: 554 Superstring
Scris de: Paul-Dan Baltescu din Ianuarie 06, 2008, 00:09:36
Ar trebui sa fie de ajuns. Te poti uita in articol (http://infoarena.ro/Automate-finite-si-KMP) cum poate fi implementat KMP-ul rapid. :)


Titlul: Răspuns: 554 Superstring
Scris de: Bondane Cosmin din Ianuarie 06, 2008, 11:22:49
Ar trebui sa fie de ajuns. Te poti uita in articol (http://infoarena.ro/Automate-finite-si-KMP) cum poate fi implementat KMP-ul rapid. :)

Pai cam asa am implementat. Nu imi dau seama ce poate fi.

LE. Mi-am gasit greseala. Era o greseala de implementare a functiei de potrivire.


Titlul: Răspuns: 554 Superstring
Scris de: Florian Marcu din Aprilie 01, 2009, 21:16:48
La problema asta, nu este suficient sa caut sirul mai scurt in cel lung, iar daca nu ii gasesc nicio aparitie ( <=> sirul scurt nu e inclus in cel lung), sa caut cel mai lung prefix al sirului s1, care este sufix pentru s2 ( si invers : cel mai lung prefix a lui s2, care este sufix pt s1), iar apoi sa aleg minimul global ? Desi mi se pare corect, iau WA. Ce cazuri scap ?  :-k

[ LE: Ideea e buna. Greseam la implementare. ]


Titlul: Răspuns: 554 Superstring
Scris de: Reality din August 14, 2015, 00:16:08
am facut o sursa cu complexitate O(n + m),cu parsare si iau tle,ce sa fac sa iau AC.


Titlul: Răspuns: 554 Superstring
Scris de: Mihai Calancea din August 14, 2015, 00:40:23
Am mărit limita, ai luat 100  :)


Titlul: Răspuns: 554 Superstring
Scris de: Stoian Mihail din August 30, 2015, 19:53:56
Va rog, imi poate spune si mie cineva(care a rezolvat problema pe baza KMP)daca ideea mea este cea buna(am primit WA)?

Am spus ca sirul "a" este sirul cel mai mic din pereche si ca "b" este sirul cel mai mare din pereche.

Intai m-am uitat sa vad daca "a" este prefix al lui "b". Daca este, atunci solutia va fi lungimea lui "b".
Daca nu, calculam cel mai lung prefix al lui "a" care este sufix al lui "b" si cel mai lung prefix al lui "b" care este sufix al lui "a".  :wink:
Dintre aceste doua rezultate aleg maximul "max", iar solutia va fi : lungimea lui "a" + lungimea lui "b" - max. :D

Pentru a calcula cele doua rezultate am folosit de doua ori functia prefix de la KMP, cu doua mici modificari(am pus "p" in loc de "str"):

Cod:
int preprocessing(char *str, int n, char *p) {
  int i, k = 0;
  for (i = 1; i < n; i++) {
    while ((k > 0) && (str[i] != p[k])) {
      k = pi[k - 1];
    }
    if (str[i] == p[k]) {
      k++;
    }
    pi[i] = k;
  }
  return k;
}

ID : http://www.infoarena.ro/job_detail/1479236

Am vazut ca la comentarii toti vorbesc de KMP, dar eu nu imi dau seama unde sa-l folosesc!  :?
Multumesc mult!  :D