P3370 【模板】字符串哈希
题目链接:https://www.luogu.com.cn/problem/P3370
题目描述
如题,给定 N个字符串(第 i 个字符串长度为 Mi ,字符串内包含数字、大小写字母,大小写敏感),请求出 N 个字符串中共有多少个不同的字符串。
友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:)
输入格式
第一行包含一个整数 N,为字符串的个数。
接下来 N 行每行包含一个字符串,为所提供的字符串。
输出格式
输出包含一行,包含一个整数,为不同的字符串个数。
输入输出样例
输入 #1
5
abc
aaaa
abc
abcc
12345
输出 #1
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之后的值用set容器的数组存起来,最后输出所存进的set容器的大小。
(set可以自动去重,去掉一个字符串hash之后所得的重复的值)
AC代码
#include<iostream>
#include<set>
using namespace std;
typedef unsigned long long ull;
ull Hash[100005],base=131;
string s,t;
set<ull> a;
ull HASH(string c) {
ull len=c.length();
Hash[0]=c[0];
for(ull i=1; i<len; i++ ) {
Hash[i]=Hash[i-1]*base+c[i];
}
return Hash[len-1];
}
int main() {
ull T;
cin>>T;
ull ans=0;
while(T--) {
cin>>s;
a.insert(HASH(s));
}
cout<<a.size()<<endl;
return 0;
}