洛谷 P3370 【模板】字符串哈希
阿新 • • 發佈:2017-11-06
多少 new %d ora 字符串個數 數據規模 正確姿勢 long class
P3370 【模板】字符串哈希
題目描述
如題,給定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人數的話),我想你一定會明白字符串哈希的正確姿勢的^_^
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define mod 163 #define ULL unsigned long long usingnamespace std; int n,ans=1; ULL h[10010]; char s[2010]; ULL hash(char s[]){ ULL Hash=0; int len=strlen(s)-1; for(int i=0;i<=len;i++) Hash=Hash*mod+s[i]-‘0‘; return Hash; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",s); h[i]=hash(s); } sort(h+1,h+1+n); for(int i=2;i<=n;i++) if(h[i]!=h[i-1]) ans++; cout<<ans; }
洛谷 P3370 【模板】字符串哈希