ABA#9594

ABA (Розбір)

Нехай s_0s_1...s_{n-1} — вхідний рядок. Нехай містить кількість літер з позиції до -ї включно. Нехай дорівнює загальній кількості літер у слові. Тоді справа від позиції знаходиться cnt - l[i] літер .

Якщо літера знаходиться у -й позиції, то зліва від неї знаходиться літер , а справа (cnt - l[i]) літер . Кількість підпослідовностей "", де літера знаходиться у -й позиції, дорівнює l[i] \cdot (cnt - l[i]).

Залишається просумувати значення l[i] \cdot (cnt - l[i]) по всіх позиціях , де знаходиться літера .

Друге рішення. Підемо по рядку зліва направо і будемо в змінній підраховувати кількість літер .

Для кожної літери в рядку у нас утворюється слів (перед поточною літерою є рівно літер ). У змінній будемо підраховувати кількість слів , які зустрілися. Для кожної літери до слід додати .

Для кожної поточної літери перед нею є слів . У змінній підраховуємо кількість слів , які зустрілися. Для кожної літери до слід додати .

Приклад

Розглянемо другий тест.

Кількість підпослідовностей "" дорівнює

1 \cdot 5 + 2 \cdot 4 + 2 \cdot 4 + 2 \cdot 4 = 5 + 8 + 8 + 8 = 29

Розглянемо значення змінних у разі розв'язання задачі другим способом.

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

Читаємо вхідний рядок .

cin >> s;

Ініціалізуємо змінні.

cnt = 0; len = s.size();
l.resize(len);

Для кожної позиції занесемо в кількість літер з позиції до -ї включно. Після закінчення циклу змінна міститиме загальну кількість літер .

for (i = 0; i < len; i++)
{
  if (s[i] == 'A') cnt++;
  l[i] = cnt;
}

У змінній підраховуємо відповідь.

res = 0;

Для кожної позиції , де знаходиться літера , підраховуємо кількість підпослідовностей "".

for (i = 0; i < len; i++)
  if (s[i] == 'B') res += 1LL * l[i] * (cnt - l[i]);

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

cout << res;

Реалізація алгоритму — комбінаторний підрахунок

Читаємо вхідний рядок .

cin >> s;

Ініціалізуємо змінні.

a = ab = aba = 0;

Перебиратимемо символи рядка. Перераховуємо змінні і .

for (i = 0; i < s.size(); i++) 
  if (s[i] == 'A')
  {
    a++;
    aba += ab;
  }
  else
  if (s[i] == 'B') ab += a;

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

cout << aba << endl;

Python реалізація

Читаємо вхідний рядок .

s = input()

Ініціалізуємо змінні.

cnt = 0
n = len(s)
l = [0] * n

Для кожної позиції занесемо в кількість літер з позиції до -ї включно. Після закінчення циклу змінна міститиме загальну кількість літер .

for i in range(n):
  if s[i] == 'A':
    cnt += 1
  l[i] = cnt

У змінній підраховуємо відповідь.

res = 0

Для кожної позиції , де знаходиться літера , підраховуємо кількість підпослідовностей "".

for i in range(n):
  if s[i] == 'B':
    res += l[i] * (cnt - l[i])

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

print(res)

Python реалізація — комбінаторний підрахунок

Читаємо вхідний рядок .

s = input()

Ініціалізуємо змінні.

a = ab = aba = 0

Перебиратимемо символи рядка. Перераховуємо змінні і .

for c in s:
  if c == 'A':
    a += 1
    aba += ab
  if c == 'B':
    ab += a

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

print(aba)