1143 - Dominant
Considerând un șir de valori binare, numim secvență dominantă un set de elemente aflate pe poziții consecutive în șir care are proprietatea că numărul valorilor egale cu 1
este strict mai mare decât numărul valorilor de 0
. De exemplu, în șirul 1,0,0,0,1,1,0,1,1,1,0,0
o secvență dominantă este 0,1,1
și o alta, de lungime mai mare, este 0,1,1,0,1,1,1
. Secvența dominantă maximală este secvența dominantă de lungime maximă. În șirul din exemplu secvența dominantă maximală este 1,0,0,0,1,1,0,1,1,1,0
(adică întreg șirul, fără ultimul zero).
Cerinţă[edit | edit source]
Dat fiind un șir de valori binare, să se determine lungimea unei secvențe dominante maximale precum și numărul acestor secvențe.
Date de intrare[edit | edit source]
Fișierul de intrare dominant.in
conține pe prima linie un număr natural V
, iar pe linia a doua șirul de valori binare, fără spații.
Date de ieșire[edit | edit source]
Fișierul de ieșire dominant.out
va conține:
- varianta 1: dacă
V=1
, atunci pe prima linie a fișierului de ieșire va fi un singur număr natural reprezentând lungimea unei secvențe dominante maximale. - varianta 2: dacă
V=2
, atunci pe prima linie a fișierului de ieșire va fi un singur număr natural reprezentând numărul secvențelor dominante maximale.
Restricții și precizări[edit | edit source]
V
poate fi1
sau2
- Lungimea șirului de valori binare este de cel mult
300 000
. - Pentru toate testele șirul binar va conține cel puțin o valoare de
1
. - Pentru 60% din punctaj
V = 1
.
Exemplul 1[edit | edit source]
dominant.in
1 100011011100
dominant.out
11
Explicație[edit | edit source]
Secvența dominantă maximală este 10001101110
și are lungimea 11
.
Exemplul 2[edit | edit source]
dominant.in
2 100011011100
dominant.out
1
Explicație[edit | edit source]
Secvența dominantă maximală este 10001101110
și are lungimea 11
. Este o singură secvență dominantă maximală.
Încărcare soluție[edit | edit source]
Lipește codul aici[edit | edit source]
<syntaxhighlight lang="python" line="1"> import sys
Nmax = 300005 inFile = "dominant.intxt" outFile = "dominant.outtxt"
s = [] * Nmax x = [0] * (2*Nmax) y = [0] * (2*Nmax) st = None dr = None optiune = 0
def main():
global s, optiune, st, dr i = 0 n = 0 suma = 0 vmin = 0 vmax = 0 lgMax = 0
# citire fin = open(inFile, 'r') fout = open(outFile, 'w') optiune = int(fin.readline()) s = '*' + fin.readline().strip()
s[0] = '*' n = len(s[1:])
suma = 0 for i in range(1, n+1): if s[i] == '1': suma += 1 else: suma -= 1 if suma > 0: if optiune == 1: fout.write(str(n) + "\n") else: fout.write("1\n") fout.close() return 0
st = x[Nmax:] dr = y[Nmax:]
# initializare st si dr for i in range(-n, n+1): st[i] = 10000000 dr[i] = -10000000
# calcul st si dr # st[i] = cea mai din stanga pozitie unde apare valoarea i # dr[i] = cea mai din dreapta pozitie unde apare valoarea i st[0] = dr[0] = 0 suma = 0 vmin = 10000000 vmax = -10000000 for i in range(1, n+1): if s[i] == '0': suma -= 1 else: suma += 1 st[suma] = min(st[suma], i) dr[suma] = max(dr[suma], i) vmin = min(vmin, suma) vmax = max(vmax, suma)
# lungimea maxima a secventei lgMax = 0 for i in range(vmin, vmax): lgMax = max(lgMax, dr[i+1] - st[i])
# numarul de aparitii ale secventei maximale s0 = 0 s1 = 0 suma = 0 for i in range(1, lgMax+1): if s[i] == '0': s0 += 1 else: s1 += 1 if s1 > s0: suma += 1 for i in range(lgMax+1, n): if s[i-lgMax] == '0': s0 -= 1 else: s1 -= 1 if s[i] == '0': s0 += 1 else: s1 += 1 if s1 > s0: suma += 1
if optiune == 1: fout.write(str(lgMax) + "\n") else: fout.write(str(suma) + "\n") fout.close() fin.close() return 0
if __name__ == "__main__":
main()
</syntaxhighlight>