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