如題,給定n個字串(第i個字串長度為mi,字串內包含數字、大小寫字母,大小寫敏感),請求出n個字串中共有多少個不同的字串。
輸入格式:
第一行包含乙個整數n,為字串的個數。
接下來n行每行包含乙個字串,為所提供的字串。
輸出格式:
輸出包含一行,包含乙個整數,為不同的字串個數。
輸入樣例#1:
5abcaaaa
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進製數對大質數取模,然後套進鄰接表來判重。**複雜度不高,而且效率也不差。
怎麼把字串在鄰接表裡套進同一雜湊值?嗯....你把它看作圖論裡的插邊。我覺得這兩種東西差不多。
下面是**。
#includeusingnamespace
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位的雜湊...