【模板】字符串哈希

题目大意:

给定N个字符串(第i个字符串长度为Mi,字符串内包含数字、大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串。

解题思路:

Hash or Tire
Hash比较简单根本原因是——我不会Tire我太蒻了
至于怎么做:
我们首先给每个字符串一个数加上自然溢出,这些数重复的概率就会十分的小
然后把这些数加入set里,(set自动去重)输出set的长度就好了

为了防止有人Copy我的程序直接交造成不利影响我在程序里加了一些神奇的东西~

Accepted code:

神TMset去重骚操作

#include<set> 
#include<cstdio> 
#include<cstring> 
#define base 233 
#define ull unsigned long long 
using namespace std; 
char c[10005]; 
ull Hash(char c[]) 
{ 
    int len=strlen(c); ull ans=0; 
    for (int i=0;i<len;i++) 
        ans=ans*base+(ull)c[i]; 
    return ans&0x7fffffff;//自然溢出 
} 
set<ull> a; 
int main() 
{ 
    int n; scanf("%d",&n); 
    for (int i=1;i<=n;i++) 
    { 
        scanf("%s",c); 
        a.insert(Hash(c)); 
    } 
    printf("%d",a.size()); 
    return 0; 
} 

无set

#include<cstdio> 
#include<cstring>  
#include<algorithm> 
#define base 233 
#define ull unsigned long long 
using namespace std; 
ull a[10005]; 
char c[10005]; 
ull Hash(char c[]) 
{ 
    int len=strlen(c); ull ans=0; 
    for (int i=0;i<len;i++) 
        ans=ans*base+(ull)c[i]; 
    return ans&0x7fffffff; 
} 
int main() 
{ 
    int n; scanf("%d",&n); 
    for (int i=1;i<=n;i++) 
    { 
        scanf("%s",c); 
        a[i]=Hash(c); 
    } 
    sort(a+1,a+n+1); 
    int ans=1; 
    for (int i=1;i<n;i++) 
        if (a[i]!=a[i+1]) 
            ans++; 
    printf("%d",ans); 
}  

猜你喜欢

转载自blog.csdn.net/qq_39798042/article/details/81748370