Используйте катящийся хеш . Если a
- ваша строка, пусть ha[x]
будет хэш первых x
символов в a
, вычисленных слева направо, и пусть hr[x]
будет хэш первых x
символов в s
вычисляется справа налево. Вы заинтересованы в последней позиции i
, для которой hf[i] = hb[i]
.
Код в C (используйте два хэша для каждого направления, чтобы избежать ложных срабатываний):
int match = n - 1;
int ha1 = 0, ha2 = 0, hr1 = 0, hr2 = 0;
int m1 = 1, m2 = 1;
for ( int i = 0; a[i]; ++i )
{
ha1 = (ha1 + m1*a[i]) % mod1;
ha2 = (ha2 + m2*a[i]) % mod2;
hr1 = (a[i] + base1*hr1) % mod1;
hr2 = (a[i] + base2*hr2) % mod2;
m1 *= base1, m1 %= mod1;
m2 *= base2, m2 %= mod2;
if ( ha1 == hr1 && ha2 == hr2 )
match = i;
}