1. 程式人生 > >bzoj3097: Hash Killer I

bzoj3097: Hash Killer I

題目
題解

Solution

如果 b a s e base 是偶數,那麼 a .

. . . . . . . . a a a
( > 64 a.........aaa(>64 a ) a)
b a . . . . . . . a a ( a ba.......aa(a 的數量為前面那麼串 a a 的數量 1 ) -1) ,這兩個串長度相同, h a s h hash 值相同,顯然串是不同的,這樣就卡掉了。
如果 b a s e base 是奇數,就比較麻煩了。
v f k vfk 的做法吧:
如果 b a s e base 是奇數的話,現在只考慮 a a b b 兩個字母。
a b a|b 表示 a a 能整除 b b 。( o r z orz 具體數學)
設數學上的函式 n o t ( S ) not(S) 表示把字串 S S 中每個位置的 a 'a' 變成 b 'b' ,把 b 'b' 變成 a 'a' 後形成的字串。
s t r A . s t r B strA.strB 代表字串串聯。
s t r |str| 表示字串 s t r str 的長度。
設字串序列 o r z s t r [ i ] {orzstr[i]} o r z s t r [ 1 ] = " a " , o r z s t r [ i ] = o r z s t r [ i 1 ] . n o t ( o r z s t r [ i 1 ] ) orzstr[1]="a",orzstr[i]=orzstr[i-1].not(orzstr[i-1])
那麼 o r z s t r [ i ] = o r z s t r [ i 1 ] 2 |orzstr[i]|=|orzstr[i-1]|*2 。顯然這是等比數列,得到: o r z s t r [ i ] = o r z s t r [ 1 ] . 2 i 1 = 2 i 1 |orzstr[i]|=|orzstr[1]|.2^{i-1}=2^{i-1}
h a s h ( s t r ) hash(str) s t r str 的雜湊值。
則:
h a s h ( o r z s t r [ i ] ) = h a s h ( o r z s t r [ i 1 ] ) b a s e n o t ( o r z s t r [ i 1 ] ) + h a s h ( n o t ( o r z s t r [ i 1 ] ) ) hash(orzstr[i])=hash(orzstr[i-1])*base^|not(orzstr[i-1])|+hash(not(orzstr[i-1]))
= h a s h ( o r z s t r [ i 1 ] ) b a s e 2 i 2 + h a s h ( n o t ( o r z s t r [ i 1 ] ) ) =hash(orzstr[i-1])*base^{2^{i-2}}+hash(not(orzstr[i-1]))
h a s h ( n o t ( o r z s t r [ i ] ) ) = h a s h ( n o t ( o r z s t r [ i 1 ] ) ) b a s e 2 i 2 + h a s h ( o r z s t r [ i 1 ] ) hash(not(orzstr[i]))=hash(not(orzstr[i-1]))*base^{2^{i-2}}+hash(orzstr[i-1])
兩式相減:
h a s h ( o r z s t r [ i ] ) h a s h ( n o t ( o r z s t r [ i ] ) ) hash(orzstr[i])-hash(not(orzstr[i]))
= ( h a s h ( o r z s