模板 字串雜湊的簡易做法

2022-05-02 03:03:10 字數 1494 閱讀 5865

如題,給定n個字串(第i個字串長度為mi,字串內包含數字、大小寫字母,大小寫敏感),請求出n個字串中共有多少個不同的字串。

輸入格式:

第一行包含乙個整數n,為字串的個數。

接下來n行每行包含乙個字串,為所提供的字串。

輸出格式:

輸出包含一行,包含乙個整數,為不同的字串個數。

輸入樣例#1:

5

abcaaaa

abcabcc

12345

輸出樣例#1:

4

時空限制:1000ms,128m

資料規模:

對於30%的資料:n<=10,mi≈6,mmax<=15;

對於70%的資料:n<=1000,mi≈100,mmax<=150

對於100%的資料:n<=10000,mi≈1000,mmax<=1500

樣例說明:

樣例中第乙個字串(abc)和第三個字串(abc)是一樣的,所以所提供字串的集合為,故共計4個不同的字串。

tip: 感興趣的話,你們可以先看一看以下三題:

bzoj3097:

bzoj3098:

bzoj3099:

如果你仔細研究過了(或者至少仔細看過ac人數的話),我想你一定會明白字串雜湊的正確姿勢的^_^

solution:

然後如何判重?兩個字串的雜湊值相同就證明這兩個字串相同——原本應該是這樣的。但由於取模,確實可能出現兩個字串hash值出現重複的情況。這時我們就需要套個鄰接表,給每個雜湊值下的字串都判斷一遍。如果沒有字串相同,再往這個雜湊值下插入這個字串,並計數加一。事實證明,雜湊值衝突的情況不多,如果鏈式前向星寫得熟那更是萬無一失。luogu評測耗時為500ms左右,比很多評測記錄還是快很多。如果只是一般的hash,我覺得用這個基本上就夠了的說....=、=想辦法把要記錄的狀態轉成k進製數,再轉成10進製數對大質數取模,然後套進鄰接表來判重。**複雜度不高,而且效率也不差。

怎麼把字串在鄰接表裡套進同一雜湊值?嗯....你把它看作圖論裡的插邊。我覺得這兩種東西差不多。

下面是**。

#includeusing

namespace

std;

const

int mod=1e6+13,n=10010

;int h[mod],nexp[n],p=1

;string s[n];//

鏈式前向星

int gethash(string

x)

return ret%mod;}//

獲取字串的雜湊值

bool inshash(string

x) nexp[p]=h[c],h[c]=p,s[p]=x,p++;

return

1;//

否則插入

}int

main()

cout

}

字串雜湊 模板

以下文字 據我的理解,hash就是乙個像函式一樣的東西,你放進去乙個值,它給你輸出來乙個值。輸出的值就是hash值。一般hash值會比原來的值更好儲存 更小 或比較。那字串hash就非常好理解了。就是把字串轉換成乙個整數的函式。而且要盡量做到使字串對應唯一的hash值。字串hash的種類還是有很多種...

模板 字串雜湊

如題,給定n個字串 第i個字串長度為mi,字串內包含數字 大小寫字母,大小寫敏感 請求出n個字串中共有多少個不同的字串。第一行包含乙個整數n,為字串的個數。接下來n行每行包含乙個字串,為所提供的字串。輸出包含一行,包含乙個整數,為不同的字串個數。s am plei nput sample input...

字串雜湊(模板)

尋找長度為n的主串s中的匹配串t 長度為m 出現的位置或次數屬於字串匹配問題。字串雜湊就是將每個字串轉化為乙個數值,然後遍歷主串,判斷在主串起始位置為i長度為m的字串的雜湊值與匹配串的雜湊值是否相等即可,每次判斷為o 1 的時間。這樣就可以轉化為o n 的時間完成判斷。若求字串中第i位到第j位的雜湊...