牛客 - Hash(思维+进制转换)
題目鏈接:點擊查看
題目大意:給出一個長度為 6 的字符串 s ,再給出模數(shù) mod,現(xiàn)在規(guī)定哈希值為如下運算:
const int LEN = 6;
int mod;
int Hash(char str[])
{
????int res = 0;
????for (int i = 0; i < LEN; i++)
????{
????????res = (res * 26 + str[i] - 'a') % mod;?
????}
????return res;
}
?問是否存在一個字符串,字典序大于 s 且哈希值相等
題目分析:讀完題后陷入思維定式好一段時間,固然以為哈希值是需要有字符串才行,于是想到用dfs暴力枚舉子串然后全排列,一開始沒計算好時間復(fù)雜度,以為是可行的,搗鼓了半天dfs,最后認(rèn)真算了一遍枚舉的復(fù)雜度為 26^6*A(6)*6,其中26^6是枚舉字符串所需要花費的時間,A(6)是對長度為 6 的字符串全排列所需要的時間,也就是 720 ,還有常數(shù) 6 是需要計算字符串的哈希值,先不管別的,26^6就已經(jīng)3e8了,顯然暴力是不可行的
于是就敞開思維開始亂猜了,發(fā)現(xiàn)如果想要找到滿足題目要求的字符串,只需將當(dāng)前字符串向后 mod 個單位就好了,稍微一轉(zhuǎn)換,會發(fā)現(xiàn)其實每一位字符代表的區(qū)間分別為[ 0 , 26 ),[ 26 , 26^2 ),[ 26^2 , 26^3 ) 以此類推,進一步再轉(zhuǎn)換一下,會發(fā)現(xiàn)這其實不就是將字符串 s 當(dāng)成一個 26 進制的數(shù)字來計算,到此為止豁然開朗,直接模擬即可
代碼:
?
?
超強干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的牛客 - Hash(思维+进制转换)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客 - 街机争霸(bfs)
- 下一篇: 牛客 - 牛牛与牛妹的约会(贪心)