Everybody knows that a huge number of different chemical reactions
happen in cells. A reaction takes as an input a set of chemicals
(substrates) and converts them to another set (products). Here we
consider all reactions to be one-directional. A substrates for a
reaction could be chemicals from the environment or products from other
reactions.
A scientist John Doe was given a cell and a list of chemicals that are present in the environment at the beginning. He already knows what reactions could happen in the cell. You should help him to understand which chemicals could appear in the cell.
The first line contains initial chemicals separated by spaces. There
is always at least one initial chemical. Each chemical is represented by
a random positive integer that fits in 4-byte integer type. Each of the
following lines describes a reaction, one per line. Each reaction is
presented as two lists of integers separated by '->': the list of
chemicals, separated by '+', that is needed to perform a reaction and
the list of chemicals, separated by '+', that are produced as a result
of the reaction. Each chemical could be present in each reaction maximum
2 times: one time at the left part and the other time at the right part
(for example, a catalyst could appear in both parts).
Constraints for the easy version: a total number of chemicals through all reactions does not exceed103
.
Constraints for the hard version: a total number of chemicals through all reactions does not exceed105 .
A scientist John Doe was given a cell and a list of chemicals that are present in the environment at the beginning. He already knows what reactions could happen in the cell. You should help him to understand which chemicals could appear in the cell.
Input Format
Constraints for the easy version: a total number of chemicals through all reactions does not exceed
.
Constraints for the hard version: a total number of chemicals through all reactions does not exceed
import sys def chem_recorder(data_set): while len(data_set) > 0: new_data_set = set() for add_chem in data_set: if add_chem not in chem_in_cell: chem_in_cell.add(add_chem) if add_chem in chems_lines: counter = 0 for chem_line in chems_lines[add_chem]: chem_line[0].remove(add_chem) if len(chem_line[0].difference(chem_in_cell)) == 0: new_add = chem_line[1].difference(chem_in_cell) new_data_set = new_data_set.union(new_add) chems_lines[add_chem].pop(counter) counter += 1 data_set = new_data_set.copy() all_lines = sys.stdin.readlines() in_cell = all_lines.pop(0) chem_in_cell = set(in_cell.strip().split(' ')) xxx = set(in_cell.strip().split(' ')) chems_lines = {} # 'chem' => [[{left_line1}, {right_line1}], [{left_line2}, {right_line2}]]for line in all_lines: line = line.strip() l1 = line.split('->') left_line = set(l1[0].split('+')) right_line = set(l1[1].split('+')) not_in_cell_chem = left_line.difference(chem_in_cell) if len(not_in_cell_chem) > 0: for nic_chem in not_in_cell_chem: if nic_chem in chems_lines: flag = 0 for chem_line in chems_lines[nic_chem]: if chem_line[0] == not_in_cell_chem: chem_line[1] = chem_line[1].union(right_line) flag = 1 break if flag == 0: chems_lines[nic_chem].append([not_in_cell_chem, right_line]) else: chems_lines[nic_chem] = [[not_in_cell_chem, right_line]] else: # gote all chems chem_recorder(right_line) chem_recorder(xxx) print(' '.join(chem_in_cell))
Комментариев нет:
Отправить комментарий