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

P3370 【模板】字符串哈希

  • 时空限制1s / 128MB

题目描述

如题,给定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个不同的字符串。

---------------------------------------------------------------------------------------------------------------

这道题 字符串哈希模版题,详细看代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #define maxn 23333
 5 int n,cnt;
 6 char a[maxn];
 7 int ans[maxn];
 8 unsigned int strhash(char*);
 9 int main(){
10     cnt=0;
11     scanf("%d",&n);
12     for(int i=1;i<=n;i++){
13         scanf(" %s",a+1);
14         ans[i]=strhash(a+1); //存下每个字符串的hash值,离线操作 
15     }
16     std::sort(ans+1,ans+1+n);
17     for(int i=2;i<=n;i++) //排序后判重 
18     if(ans[i]!=ans[i-1]) cnt++;
19     printf("%d
",cnt+1);
20     return 0;
21 }
22 unsigned int strhash(char *str){
23     unsigned int seed=233;
24     unsigned int hash=0;
25     while(*str){
26         hash=hash*seed+(*str++);
27     }
28     return hash;//因为返回值为unsigned int类型,所以让它自然溢出,不用再取模 
29 }
字符串哈希
原文地址:https://www.cnblogs.com/lpl-bys/p/7719084.html