If your strings are so similar, why can't you generate them at run-time?
::sprintf_s( szBuffer, MAXLEN, "Some very long string %u . ..", ui32Index );
Or similar. This sounds as though this problem is meant to be tackled via out-of-the-box thinking rather than by working around computer-science issues.
For what it's worth, using constant strings as just pointers into a data section is reliable enough that it is used in ASKA Engine (tri-Ace) to implement "print-once" error messages. To avoid spamming the console, the string pointer is kept, not an actual copy of the string. This is important for run-time as we do need running builds of the games that also print (or silence) debug messages quickly. So you will use a macro such as "ASSERT_ONCE( someCondition, "The condition failed. Checkmate, atheists." )", and as long as "pool strings" is set then this string pointer will have 1 pointer no matter where it is used, so redundancy checks on the string can be done just by checking the pointer, not the string.
This has been very tested over many years and is reliable on all consoles and relevant platforms (and most irrelevant platforms), however do keep in mind that it is only used for debug purposes, as it is not guaranteed by the standard. Code that relies on this should not be put into the wild.
L. Spiro