unsigned reverse( unsigned int h)
{
bitset< 32 > hash;
// 1. hash = hash + (hash << 16);
for ( int i = 0 ; i < 32 ; i + = 16 )
h = h - ( ( h & ( ( ( 1LL << 16 ) - 1 ) << i) ) << 16 ) ;
// 2. hash = hash ^ (hash >> 11);
hash = h;
for ( int i = 20 ; i >= 0 ; i-- )
hash[ i] = hash[ i] ^ hash[ i + 11 ] ;
h = hash.to_ulong ( ) ;
// 3. hash = hash + (hash << 3);
for ( int i = 0 ; i < 32 ; i + = 3 )
h = h - ( ( h & ( ( ( 1LL << 3 ) - 1 ) << i) ) << 3 ) ;
// 4. hash = hash ^ (hash >> 6);
hash = h;
for ( int i = 25 ; i >= 0 ; i-- )
hash[ i] = hash[ i] ^ hash[ i + 6 ] ;
h = hash.to_ulong ( ) ;
// 5. hash = hash + (hash << 10);
for ( int i = 0 ; i < 32 ; i + = 10 )
h = h - ( ( h & ( ( ( 1LL << 10 ) - 1 ) << i) ) << 10 ) ;
return h;
}
dW5zaWduZWQgcmV2ZXJzZSh1bnNpZ25lZCBpbnQgaCkKewoJYml0c2V0PDMyPiBoYXNoOwoJLy8gMS4gaGFzaCA9IGhhc2ggKyAoaGFzaCA8PCAxNik7Cglmb3IoaW50IGkgPSAwOyBpIDwgMzI7IGkgKz0gMTYpCgkJaCA9IGggLSAoKGggJiAoKCgxTEwgPDwgMTYpIC0gMSkgPDwgaSkpIDw8IDE2KTsKCS8vIDIuIGhhc2ggPSBoYXNoIF4gKGhhc2ggPj4gMTEpOwoJaGFzaCA9IGg7Cglmb3IoaW50IGkgPSAyMDsgaSA+PSAwOyBpLS0pCgkJaGFzaFtpXSA9IGhhc2hbaV0gXiBoYXNoW2kgKyAxMV07CgloID0gaGFzaC50b191bG9uZygpOwoJLy8gMy4gaGFzaCA9IGhhc2ggKyAoaGFzaCA8PCAzKTsKCWZvcihpbnQgaSA9IDA7IGkgPCAzMjsgaSArPSAzKQoJCWggPSBoIC0gKChoICYgKCgoMUxMIDw8IDMpIC0gMSkgPDwgaSkpIDw8IDMpOwoJLy8gNC4gaGFzaCA9IGhhc2ggXiAoaGFzaCA+PiA2KTsKCWhhc2ggPSBoOwoJZm9yKGludCBpID0gMjU7IGkgPj0gMDsgaS0tKQoJCWhhc2hbaV0gPSBoYXNoW2ldIF4gaGFzaFtpICsgNl07CgloID0gaGFzaC50b191bG9uZygpOwoJLy8gNS4gaGFzaCA9IGhhc2ggKyAoaGFzaCA8PCAxMCk7Cglmb3IoaW50IGkgPSAwOyBpIDwgMzI7IGkgKz0gMTApCgkJaCA9IGggLSAoKGggJiAoKCgxTEwgPDwgMTApIC0gMSkgPDwgaSkpIDw8IDEwKTsKCXJldHVybiBoOwp9