传送门
输入输出样例
输入
5
abc
aaaa
abc
abcc
12345
输出
4
主要考察哈希,用unsigned long long,在超过232的时候会自然溢出
哈希的思路类似于二进制十进制十六进制……的转换规则
代码:
新增
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
const ull mod=1e9+7;
const int N =1e4+7;
const int p=131;
ull a[N],h[N];
//ull ans[N];
set<ull>se;
void hash1(string s){//预处理hash函数前缀和
a[0]=1;
int n=s.size();
for(int i=1;i<=n;i++){
a[i]=a[i-1]*p%mod;
h[i]=(h[i-1]*p%mod+s[i-1])%mod;
}
}
ull get(int l,int r){//计算s[l--r]的hash值
return (h[r]-h[l-1]*a[r-l+1]+mod)%mod;
}
int main(){
int n;cin>>n;string s;
for(int i=0;i<n;i++){
cin>>s;
hash1(s);
se.insert(h[s.size()]);
}
cout<<se.size();
return 0;
}
以前
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-6
const int ma=1e4+10;
typedef long long ll;
typedef unsigned long long ull;
ull a[ma];
char s[ma];
ull mod=212370440130137957ll;
ull base=131; //dalao们都说这个好,具体原因我也不知道
ull hhash(){
int len=strlen(s);
ull ans=0;
for(int i=0;i<len;i++) ans=(ans*base+(ull)s[i])%mod;//这里不mod也没事,数据没卡,但是最好mod
return ans;
}
int main()
{
int n,ans=1;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",s);
a[i]=hhash();//运用哈希将字符串转为数字存起来
}
sort(a+1,a+n+1);//排序为了后面方便判断字符串是否相同
for(int i=1;i<n;i++){
if(a[i]!=a[i+1]) ans++;
}
printf("%d",ans);
return 0;
}