Нехай s_0s_1...s_{n-1} — вхідний рядок. Нехай містить кількість літер з позиції до -ї включно. Нехай дорівнює загальній кількості літер у слові. Тоді справа від позиції знаходиться cnt - l[i] літер .
Якщо літера знаходиться у -й позиції, то зліва від неї знаходиться літер , а справа (cnt - l[i]) літер . Кількість підпослідовностей "", де літера знаходиться у -й позиції, дорівнює l[i] \cdot (cnt - l[i]).
Залишається просумувати значення l[i] \cdot (cnt - l[i]) по всіх позиціях , де знаходиться літера .
Друге рішення. Підемо по рядку зліва направо і будемо в змінній підраховувати кількість літер .
Для кожної літери в рядку у нас утворюється слів (перед поточною літерою є рівно літер ). У змінній будемо підраховувати кількість слів , які зустрілися. Для кожної літери до слід додати .
Для кожної поточної літери перед нею є слів . У змінній підраховуємо кількість слів , які зустрілися. Для кожної літери до слід додати .
Приклад
Розглянемо другий тест.
Кількість підпослідовностей "" дорівнює
Розглянемо значення змінних у разі розв'язання задачі другим способом.
Реалізація алгоритму
Читаємо вхідний рядок .
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)