luogu3370 【模板】字符串哈希

題目描述

如題,給定N個字符串(第i個字符串長度爲Mi,字符串內包含數字、大小寫字母,大小寫敏感),請求出N個字符串中共有多少個不同的字符串。
友情提醒:如果真的想好好練習哈希的話,請自覺,否則請右轉PJ試煉場:)
輸入輸出格式

輸入格式:

第一行包含一個整數N,爲字符串的個數。

接下來N行每行包含一個字符串,爲所提供的字符串。

輸出格式:

輸出包含一行,包含一個整數,爲不同的字符串個數。
輸入輸出樣例
輸入樣例#1: 複製

5
abc
aaaa
abc
abcc
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)是一樣的,所以所提供字符串的集合爲{aaaa,abc,abcc,12345},故共計4個不同的字符串。

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

BZOJ3097:http://www.lydsy.com/JudgeOnline/problem.php?id=3097

BZOJ3098:http://www.lydsy.com/JudgeOnline/problem.php?id=3098

BZOJ3099:http://www.lydsy.com/JudgeOnline/problem.php?id=3099

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

字符串hash怎麼搞 假如我可以存的下 那麼我開一個10000位 每位都是1500的數不是可以o(1)去判斷那麼我hash就是這個套路 只不過取模之後我就可以存的下 那麼關於這題我是unsigned longlong 表示我對2^64進行取模 讓他自然溢出 出題人沒有卡還是很好的 統計答案 我最後排序一下 然後常規方法判斷即可

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ull unsigned long long
#define N 11000
ull base=131,a[N];int n;char s[N];
using namespace std;
ull ha_sh(char s[]){
    int n=strlen(s+1);ull tmp=0;
    for (int i=1;i<=n;++i) tmp=tmp*base+(ull)s[i];return tmp&0x7fffffff;
}
int main(){
//	freopen("3370.in","r",stdin);
    scanf("%d",&n);
    for (int i=1;i<=n;++i) scanf("%s",s+1),a[i]=ha_sh(s+1);
    sort(a+1,a+n+1);int ans=0;ull last=0;
    for (int i=1;i<=n;++i){
        if (a[i]!=last) ++ans,last=a[i];
    }printf("%d",ans);
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章