Laiko ribojimas: 1.6s
Atminties ribojimas: 8MB
Duomenų failas: skirtumu_analize.in
Rezultatų failas: skirtumu_analize.out
Skirtūmų analizė
Kartais išsiuntus labai daug galimų problemos sprendimo variantų, darosi sunku sekti kokie pakeitimai kaip įtakojo galutinį programos pasirodymą. siuntimas - klaida teste, siuntimas - klaida teste - o ką aš pakeičiau?
Į tokius klausimus padeda atsakyti specialios programos, atliekančios failų skirtumų analizę. Pavyzdžiui, jeigu turime du sprendimus:
37.cpp | 84.cpp |
---|---|
#include \<cstdio> int main(int argc, char argv) { int N; scanf("\%d", &N); if (N == 0) printf("\%d", 0); else printf("\%.2f", 5.0 / N); return 0; } |
#include \<cstdio> int main(int argc, char **argv) { int N; scanf("\%d", &N); if (N < 0) printf("\%.2f", -5.0 / N); else printf("\%.2f", 5.0 / N); return 0; } |
Galime pasinaudoti standartine UNIX program diff (tie, kas nori pasibandyti vizualius multiplatforminius įrankius, gali pasidomėti - meld, kdiff3, vimdiff ir t.t.) ir taip sužinoti kokie pakeitimai buvo padaryti:
\$ diff 37.cpp 84.cpp 5c5 \< if (N == 0) printf("\%d", 0); --- > if (N < 0) printf("\%.2f", -5.0 / N); |
Ir ką mes sužinojome? Na diff pasakė, kad tarp šių siuntimų buvo vienintelis pakeitimas, t.y. 37.cpp 5 eilutė buvo pašalinta ir pakeista 5 84.cpp eilute. Tad norint išspręsti uždavinį, kuris klausia kokia bus išraiškos absoliuti (be minuso) reikšmė, reikia siųsti programą:
#include \<cstdio> int main(int argc, char **argv) { int N; scanf("\%d", &N); if (N == 0) printf("\%d", 0); else if (N < 0) printf("\%.2f", -5.0 / N); else printf("\%.2f", 5.0 / N); return 0; } |
Skirtumų ieškančios programos savo darbą atlieka trimis etapais. Pirmajame etape jos kiekvieną failų F1 ir F2 eilutę perleidžia per maišos funkciją, taip eilutes supaprastinant ir palengvinant jų lyginimą (pvz.: failą F1 galėtų atitikti - 'abcdefgh', o F2 - 'abcdzfgh'). Antrojo etapo metu atliekamas algoritmas, kuris pasako didžiausią bendrą failų eilučių poaibį S. Trečiajame etape, skirtumų ieškančios programos, atlieka modifikuotą sąlajos algoritmą, kuris lygina failų F1 ir F2 eilutes su S ir pažymi, kurios eilutės buvo išmestos, o kurios įdėtos.
Jūsų užduotis bus atlikti antrąją programos veikimo dalį. Jums bus duotos dvi simbolinės eilutės, kurių pirmoji atitiks failo F1 eilutes perleistas per maišos funkciją, o antroji failo F2. Taip pat žinoma, kad maišos funkcija, naudota konvertuojant eilutes, vienai eilutei grąžina vieną lotynišką raidę.
Pradiniai duomenys
2 simbolinės eilutės (pateiktos skirtingose eilutėse), sudarytos iš lotyniškų raidžių. Kiekvienos eilutės ilgis yra mažesnis už .
Rezultatai
Maksimalus bendras duotų eilučių poaibis.
Pavyzdžiai
Pradiniai duomenys | Rezultatai |
---|---|
abcdefgh abcdzfgh |
abcdfgh |