1. 程式人生 > >洛谷——P3370 【模板】字符串哈希

洛谷——P3370 【模板】字符串哈希

大小寫 100% max algorithm () problem pri node pan

題目描述

如題,給定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人數的話),我想你一定會明白字符串哈希的正確姿勢的^_^

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdio>
 5 
 6 #define ull unsigned long long
 7 #define base1 1499
 8 #define
base2 1493 9 10 using namespace std; 11 12 const int N(10000+15); 13 char s[N]; 14 ull n; 15 struct Node 16 { 17 ull hash1,hash2; 18 }node[N]; 19 20 ull Get_hash1(char a[],ull len) 21 { 22 ull ret=1; 23 for(int i=0;i<len;i++) 24 ret=ret*base1+(a[i]-0); 25 return ret; 26 } 27 28 ull Get_hash2(char a[],ull len) 29 { 30 ull ret=1; 31 for(int i=0;i<len;i++) 32 ret=ret*base2+(a[i]-0); 33 return ret; 34 } 35 36 bool cmp(Node a,Node b) 37 { 38 39 return a.hash1<b.hash1; 40 } 41 42 int main() 43 { 44 scanf("%d",&n); 45 for(int i=1;i<=n;i++) 46 { 47 scanf("%s",s); 48 node[i].hash1=Get_hash1(s,strlen(s)); 49 node[i].hash2=Get_hash2(s,strlen(s)); 50 } 51 sort(node+1,node+n+1,cmp); 52 int ans=1; 53 for(int i=2;i<=n;i++) 54 if(node[i].hash1==node[i-1].hash1&&node[i].hash2==node[i-1].hash2) continue; 55 else ans++; 56 printf("%d\n",ans); 57 return 0; 58 }

洛谷——P3370 【模板】字符串哈希