другая возможность - хранить строки в три , а знак '$' указывает конец каждой строки. используйте двусвязные указатели для каждого шага и удерживайте указатель с двойной связью от каждого «$» (конец имени) до его номера (в массиве или списке).
сейчас, когда вы хотите получить телефон от имени:
find the '$' indicating the end of the word for this string.
it is connected to a number in a list - that is your number.
когда вы хотите получить имя с телефона:
find the number, it is connected to a '$' sign.
follow the up-links all the way to the root, this will get you the name (reversed).
reverse it and you are done.
также, как я сказал в комментарии (относительно подхода с двойной картой): предполагая, что ваши строки довольно большие, и карта содержит указатель / ссылку на строку (а не фактическую строку), вы можете предполагать хранение необходимое пространство будет не двойным, а чем-то намного лучше.