We consider the problem of storing a dynamic string S over an alphabet
Σ={1,…,σ} in compressed form. Our representation
supports insertions and deletions of symbols and answers three fundamental
queries: access(i,S) returns the i-th symbol in S,
ranka(i,S) counts how many times a symbol a occurs among the
first i positions in S, and selecta(i,S) finds the position
where a symbol a occurs for the i-th time. We present the first
fully-dynamic data structure for arbitrarily large alphabets that achieves
optimal query times for all three operations and supports updates with
worst-case time guarantees. Ours is also the first fully-dynamic data structure
that needs only nHk+o(nlogσ) bits, where Hk is the k-th order
entropy and n is the string length. Moreover our representation supports
extraction of a substring S[i..i+ℓ] in optimal O(logn/loglogn+ℓ/logσn) time