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