Afişează mesaje
|
Pagini: [1]
|
4
|
infoarena - concursuri, probleme, evaluator, articole / Algoritmiada 2016 / Răspuns: Revsecv
|
: Ianuarie 27, 2016, 16:52:15
|
Ma gandesc asa: combin sirul normal cu sirul reversed despartite de un caracter si construiesc suffix array-ul. Parcurg in ordine descrescatoare sufixele (de exemplu) si ma intereseaza suma tuturor LCP-urilor dintre sirul curent si cele de sub el, pe care o adun la solutie. La schimbarea indexului, va trebui sa modific LCP-urile de dedesubt, si am nevoie de inca o structura de date care sa-mi spuna cate valori mai mari decat o anumita valoare am si sa le transforme pe toate intr-o anumita valoare. M-am gandit aici la un arbore de intervale cu lazy update. Indexul va fi intotdeauna pe un sufix al sirului reversed, iar suma LCP-urilor o voi lua doar din cele care apartin sirului normal. S-ar putea sa ma complic tare, dar asta e ideea la care am ajuns. Totusi, nu-mi dau seama inca cum voi elimina solutiile care nu sunt disjuncte.
|
|
|
8
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 1282 Palindrom3
|
: Martie 02, 2015, 09:30:02
|
Eu m-am gandit asa. Sa spunem ca am un numar de forma aa si vreau sa-l aduc la forma baab. Am restul de la aa, il numesc Rest. Ca sa aflu restul de la baab, fac urmatorul lucru. aa * 10 + b -> (Rest * 10 + b) % K si am restul lui aab la impartirea cu K acum Adaug si b in fata => b * (10 ^ 3) + aab -> (b * (10 ^ 3) + Restul_lui_aab_la_impartirea_cu_K) % K Si acum m-am gandit ca iese restul lui baab la impartirea cu K. Rezultatele partiale ar trebui sa fie diferite fata de cealalta formula. Dar ma gandesc ca cel final ar trebui sa fie acelasi... Ce e gresit?
|
|
|
9
|
infoarena - concursuri, probleme, evaluator, articole / Arhiva de probleme / Răspuns: 1282 Palindrom3
|
: Martie 01, 2015, 22:18:07
|
Salut, Am facut problema. Dar am o intrebare. Cunosc doua metode de a calcula resturile in dinamica. Aparent, una merge, cealalta nu. Prima, cea de 100, este chiar cea din descrierea solutiei realizata de autori. int new_rest = (j + (P10[len - i] + P10[i - 1]) * k) % K; unde j este vechiul rest, P10[y] = (10 ^ y) % K, k noua cifra adaugata la inceputul si sfarsitul numarului anterior din dinamica si K - numarul din input cu care numarul trebuie sa se divida A doua: int new_rest = (j + P10[len - 2 * i + 1] * k) % K; new_rest = (new_rest * P10[1] + k) % K; Literele au ramas identice cu cele de mai sus. Inteleg ambele variante, insa, a doua pare a fi incorecta. Nu inteleg de ce. Ma poate ajuta cineva? Va multumesc anticipat!
|
|
|
|