Спершу згорнемо потрійну суму в одну.
У виразі пара позицій з i \le j дає внесок |s_i - s_j| рівно стільки разів, скільки підрядків її містять, тобто i \cdot (n - j + 1). Отже,
Тепер зрозуміло, що для кожної позиції важливі дві ваги: «ліва» w_i = i і «права» v_i = n - i + 1. А сама різниця |s_i - s_j| залежить лише від літер, яких усього .
Це підказує дерево відрізків, у вузлі якого зберігаємо:
— відповідь для відрізка, що відповідає вузлу;
— суму ваг w_i по позиціях відрізка з літерою ;
— суму ваг v_i по позиціях відрізка з літерою .
Злиття двох вузлів: пари, у яких обидві позиції в лівій (або обидві в правій) частині, уже враховані в дитячих . Залишаються пари « ліворуч, праворуч», для яких i < j, тому внесок дорівнює
Масиви і у злитті просто додаються поелементно.
Наївно ця подвійна сума коштує 26^2 на злиття, що при n, q \le 2 \cdot 10^5 уже забагато. Але її легко звести до : для кожного
а всі чотири суми беруться з префіксних сум масивів та c \cdot W[c], які будуються за .
Тоді побудова дерева коштує , а кожен запит (зміна однієї літери) — \mathcal{O}(26 \log n), бо перераховуються лише вузли на шляху до кореня. Відповідь — у корені; виводимо її до всіх запитів і після кожного.
Усі обчислення ведіть за модулем 10^9+7, не забуваючи додавати модуль після віднімань.