Добрый день.
Хочется найти быстрое решение задачи: дан массив
![$A$ $A$](https://dxdy-02.korotkov.co.uk/f/5/3/d/53d147e7f3fe6e47ee05b88b166bd3f682.png)
длины
![$n$ $n$](https://dxdy-02.korotkov.co.uk/f/5/5/a/55a049b8f161ae7cfeb0197d75aff96782.png)
символов, требуется построить массив чисел
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
, такой что на
![$i$ $i$](https://dxdy-04.korotkov.co.uk/f/7/7/a/77a3b857d53fb44e33b53e4c8b68351a82.png)
-ой позиции массива
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
стоит число
![$x$ $x$](https://dxdy-04.korotkov.co.uk/f/3/3/2/332cc365a4987aacce0ead01b8bdcc0b82.png)
тогда и только тогда, когда
![$A[x] = A[i]$ $A[x] = A[i]$](https://dxdy-01.korotkov.co.uk/f/c/c/a/cca6b570074a49de70f665bfa8a2d25182.png)
или
![$x = -1$ $x = -1$](https://dxdy-01.korotkov.co.uk/f/4/f/5/4f55c1a1c36fc8791154b938c9a3c14682.png)
и число x максимальное с таким свойством из тех, что
![$< i$ $< i$](https://dxdy-04.korotkov.co.uk/f/b/c/1/bc158c41f45155c72c18aa09ca2391a282.png)
, притом для одинаковых символов из массива A должна быть ровно одна позиция
![$B$ $B$](https://dxdy-03.korotkov.co.uk/f/6/1/e/61e84f854bc6258d4108d08d4c4a085282.png)
, где стоит единица (т.е. при первом появлении символа в массиве A). Пример: массив
![$A : a, b, c, d, c, c, a$ $A : a, b, c, d, c, c, a$](https://dxdy-04.korotkov.co.uk/f/3/b/6/3b6a79aef7282a0412fa1d7cf292c26d82.png)
; массив
![$B: -1, -1, -1, -1, 2, 4, 0$ $B: -1, -1, -1, -1, 2, 4, 0$](https://dxdy-01.korotkov.co.uk/f/4/5/b/45b9b86740988f652d841e241304071d82.png)
.
Решение есть и даже за
![$O(n)$ $O(n)$](https://dxdy-02.korotkov.co.uk/f/1/f/0/1f08ccc9cd7309ba1e756c3d9345ad9f82.png)
, но хочется попроще.
Составить хэш таблицу
![$H$ $H$](https://dxdy-04.korotkov.co.uk/f/7/b/9/7b9a0316a2fcd7f01cfd556eedf72e9682.png)
символов, изначально в каждой ячейке которой поместить
![$-1$ $-1$](https://dxdy-03.korotkov.co.uk/f/e/1/1/e11a8cfcf953c683196d7a48677b227782.png)
. После поочерёдно пробежаться по массиву
![$A$ $A$](https://dxdy-02.korotkov.co.uk/f/5/3/d/53d147e7f3fe6e47ee05b88b166bd3f682.png)
и выполнить операцию: на
![$i$ $i$](https://dxdy-04.korotkov.co.uk/f/7/7/a/77a3b857d53fb44e33b53e4c8b68351a82.png)
-ом шаге в
![$B[i]$ $B[i]$](https://dxdy-01.korotkov.co.uk/f/c/e/a/cea5ec6daf8ad684cb027866d7c3674b82.png)
вписать
![$H[A[i]]$ $H[A[i]]$](https://dxdy-04.korotkov.co.uk/f/3/e/b/3eb1860176dcbd55265fe0bfcd0c106b82.png)
и заменить
![$H[A[i]]$ $H[A[i]]$](https://dxdy-04.korotkov.co.uk/f/3/e/b/3eb1860176dcbd55265fe0bfcd0c106b82.png)
на
![$i$ $i$](https://dxdy-04.korotkov.co.uk/f/7/7/a/77a3b857d53fb44e33b53e4c8b68351a82.png)
.
Меня именно не устраивает в этом решении использование хэш функции. Задача очень естесственная и уже несколько раз встречалась на практике. Понятно, за ассимптотикой некуда гнаться, хочется за константой.
Заранее спасибо за Ваши советы.
P.S.: Понятно, что тут можно под каждый символ создать массив, там всего будет 24 ячейки - не велика потеря, но изначально задача стоит так, что и в первом массиве - числа.