Божевільний вчений#10118

Божевільний вчений (Розбір)

Будемо переглядати рядки і зліва направо. Розглянемо позиції, в яких символи рядків відрізняються. Нехай — індекс першої такої позиції, що a_i \ne b_i. Це означає, що символ у рядку на позиції необхідно інвертувати. У цей момент ми фіксуємо початок інтервалу застосування машини.

Далі продовжуємо рухатися вправо, поки символи рядків продовжують відрізнятися, тобто для всіх індексів з інтервалу i \le k \le j виконується умова a_k \ne b_k. Як тільки зустрічається позиція j + 1, для якої a_{j+1} = b_{j+1}, поточний інтервал завершується. Цей інтервал є максимальним за включенням: розширити його ні вліво, ні вправо не можна.

Кожному такому інтервалу відповідає рівно одне застосування машини MCBF-3000, оскільки машина інвертує всі символи на вибраній підрядку, тим самим одночасно виправляючи всі неспівпадіння всередині інтервалу. Таким чином, відповіддю на задачу є кількість таких максимальних інтервалів.

Приклад

Для заданого прикладу існує два неперетинних інтервали, на яких необхідно застосувати машину MCBF-3000.

Реалізація алгоритму

Читаємо вхідні дані.

cin >> n >> a >> b;

У змінній зберігаємо довжину поточного інтервалу неспівпадінь. У змінній накопичуємо відповідь — кількість застосувань машини.

res = cnt = 0;

Послідовно обробляємо символи рядків.

for (i = 0; i < n; i++)

Якщо a_i \ne b_i, збільшуємо на одиницю.

  if (a[i] != b[i])
    cnt++;

В іншому випадку (якщо a_i = b_i), поточний інтервал неспівпадінь завершується: скидаємо в нуль і збільшуємо лічильник інтервалів на одиницю.

  else
  {
    if (cnt > 0) res++;
    cnt = 0;
  }

Якщо cnt > 0, це означає, що в кінці рядка залишився незавершений інтервал неспівпадінь, для якого також необхідно здійснити одне застосування машини.

if (cnt > 0) res++;

Виводимо відповідь.

cout << res << endl;

Python реалізація

Читаємо вхідні дані.

n = int(input())
a = input()
b = input()

У змінній зберігаємо довжину поточного інтервалу неспівпадінь. У змінній накопичуємо відповідь — кількість застосувань машини.

res = cnt = 0

Послідовно обробляємо символи рядків.

for i in range(n):

Якщо a_i \ne b_i, збільшуємо на одиницю.

  if a[i] != b[i]: cnt += 1

В іншому випадку (якщо a_i = b_i), поточний інтервал неспівпадінь завершується: скидаємо в нуль і збільшуємо лічильник інтервалів на одиницю.

  else:
    if cnt > 0: res += 1
    cnt = 0

Якщо cnt > 0, це означає, що в кінці рядка залишився незавершений інтервал неспівпадінь, для якого також необхідно здійснити одне застосування машини.

if cnt > 0: res += 1

Виводимо відповідь.

print(res)