1598 - Coada1

De la Universitas MediaWiki

Se consideră C o coadă de numere naturale, iniţial vidă. Se definesc două tipuri de operaţii.

Operaţia 1 : push X, adaugă elementul X în coadă. Dacă X există deja în coadă, se scot toate elementele din coadă, pana la întâlnirea lui, inclusiv X. Exemplu: C: 2 4 5 1 6 Push 5 C: 1 6 5 ( s-au scos 2, 4, 5).

Operaţia 2: query X, cere afişarea poziţiei elementului X în coada C. Dacă elementul nu există în coadă, se afişează -1. Exemplu: C: 2 5 1 3 7 Query 1 Răspuns: 3

Cerința

Dându-se M, reprezentând numărul de operaţii şi cele M operaţii, să se răspundă la operaţiile de tip query.

Date de intrare

Fișierul de intrare coada1in.txt conține:

  • Pe prima linie numărul natural M;
  • Pe următoarele M linii, câte un string şi câte un număr natural, de forma tip_operaţie x, reprezentând tipul operaţiei şi numărul X.

Date de ieșire

Fișierul de ieșire coada1out.txt va conține:

  • Răspunsurile pentru operaţiile de tip query, câte unul pe linie.

Restricții și precizări

  • 1 ≤ M ≤ 50.000
  • 1 ≤ X ≤ 1.000

Exemplul 1:

coada1in.txt
10
push 3
push 6
push 8
push 2
query 6
push 6
query 4
push 6
push 7
query 6
coada1out.txt
Datele de intrare corespund restrictiilor impuse
2
-1
1

Exemplul 2:

coada1in.txt
coada1
coada1out.txt
Datele de intrare nu corespund restrictiilor impuse

Explicație

Înaintea primei întrebări, coada arată asa: 3 6 8 2, deci 6 apare pe poziţia 2. Înaintea celei de-a doua întrebări, coada arată asa: 8 2 6, deci 4 nu apare. Înaintea ultimei întrebări, coada arată asa: 6 7, deci 6 apare pe poziţia 1.


Rezolvare

def validare(m, operatii):  # funcția de validare a datelor de intrare
    if m < 1 or m > 50000:
        raise ValueError
    for operatie in operatii:
        if operatie[0] not in ['push', 'query']:
            raise ValueError
        x = operatie[1]
        if x < 1 or x > 1000:
            raise ValueError
    file_out.write("Datele de intrare corespund restrictiilor impuse\n")


def solve(operatii):  # funcția de rezolvare
    queue = []
    output = []
    for operatie in operatii:
        if operatie[0] == 'push':
            x = operatie[1]
            if x in queue:
                queue = queue[queue.index(x)+1:]
            queue.append(x)
        elif operatie[0] == 'query':
            x = operatie[1]
            if x in queue:
                output.append(queue.index(x) + 1)
            else:
                output.append(-1)
    return output


if __name__ == '__main__':
    file_in = open("coada1in.txt", "r")  # declararea fisierelor
    file_out = open("coada1out.txt", "w")  # fisierul out trebuie declarat cu optiunea "w" (write)

    try:
        M = int(file_in.readline())
        operations = []
        for _ in range(M):
            operation = file_in.readline().split()
            operation[1] = int(operation[1])
            operations.append(operation)

        validare(M, operations)  # apelul funcției de validare
        results = solve(operations)  # apelul funcției de rezolvare

        for result in results:
            file_out.write(str(result) + '\n')

    except ValueError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")
    except IndexError:
        file_out.write("Datele de intrare nu corespund restrictiilor impuse")