Algoritmi genetici - mutație


Trimite soluție

Puncte: 10 (parțial)
Limita de timp: 1.0s
Limita de memorie: 16M

Autor:
Tip de problemă
Limbajele acceptate
C, C++, Java, Python

Descriere

Context

Un mod de a produce noi soluții candidat în cadrul unui algoritm genetic este prin mutații. Dacă reprezentăm cromozomii prin șiruri binare, o mutație constă alegerea aleatoare a unor biți pe care să-i inversăm (\(0\) devine \(1\) și viceversa).

Cerință

Fiind dat un cromozom de lungime \(l\) biți și \(k\) indici \(i_1, i_2, \dots, i_k\), aplicați cele \(k\) mutații pe genotipul cromozomului.

Dacă cromozomul este \[ C = x_0 \; x_1 \; \dots \; x_{l-1} \] atunci cromozomul rezultat în urma aplicării mutațiilor \(i_1, i_2, \dots, i_k\) este: \[ C' = x_0 \; \dots \; \overline{x_{i_1}} \; \dots \overline{x_{i_2}} \; \dots \; \overline{x_{i_k}} \; \dots \; x_{l-1} \] unde cu \(\overline{x_j}\) am notat negarea bitului de pe poziția \(j\).

Date de intrare

Se citesc de la tastatură două numere naturale \(l\) și \(k\), reprezentând lungimea cromozomilor cu care lucrăm, respectiv numărul de mutații pe care le vom aplica pe cromozom. Pe următoarea linie se va citi un șir binar \(C\) de lungime \(l\), reprezentând cromozomul care va suferi mutațiile. Pe ultima linie vom citi un șir de \(k\) numere naturale, \(i_1, i_2, \dots, i_k\), reprezentând pozițiile biților care trebuie mutați.

Date de ieșire

Afișați cromozomul obținut după aplicarea mutațiilor.

Restricții și precizări

  • \(1 \leq l \leq 100\)
  • \(1 \leq k \leq 50\)
  • \(0 \leq i_j \leq l - 1\) pentru orice \(j = \overline{1, k}\)
  • Indicii de mutație nu sunt neapărat distincți.

Exemplul 1

Input
4 3
1011
0 1 2
Output
0101
Explicație

Avem de aplicat mutația pe primii 3 biți. Primul bit se schimbă din \(1\) în \(0\), al doilea bit se schimbă din \(0\) în \(1\), iar al treilea bit se schimbă din \(1\) în \(0\).

Exemplul 2

Input
8 6
10101101
3 1 0 1 2 7
Output
00011100
Explicație

Deoarece bitul cu indicele \(2\) ajunge să fie mutat de două ori, biții care se schimbă efectiv sunt doar cei cu indicii \(0\), \(2\), \(3\) și \(7\).