luogu#P4235. Hash?
Hash?
题目背景
zhoutb2333学习了哈希算法,他于是去统计给定一些字符串,其中有多少个本质不同的字符串。
但是zhoutb2333突发奇想,如果哈希采用的每次随机,那么结果会变成什么样呢?
辣鸡出题人又出锅了!subtask3的数据有问题,现在统一将模数改为65537
题目来源:zhoutb2333
题目描述
他通过某种办法,获得了一个函数:,它会等概率地返回一个中的整数。
他写下了这样的代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int x=10,maxn=35,maxlen=16010;
ll HASH[maxn];
const ll p=65537;
char str[maxlen];
ll Hash(){
int base=Rand(x);
ll ret=0;
for(int i=1;str[i];i++)
ret=(ret*base+str[i]-'a'+1)%p;
return ret;
}
int main(){
int ans=0,n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%s",str+1),HASH[i]=Hash();
sort(HASH+1,HASH+n+1);
HASH[0]=-1;
for(int i=1;i<=n;i++)
ans+=(HASH[i]!=HASH[i-1]);
printf("%d\n",ans);
return 0;
}
zhoutb2333想问你,给定一些字符串和参数,答案的期望是多少呢?
是质数
参数在这个程序中是确定的,但是每次输入会给定。
输入格式
第一行三个整数,表示生成的参数和字符串的个数
接下来行每行一个字符串,字符串仅由小写字母组成。
输出格式
一行一个小数,表示答案的期望,模输出。
即:如果你的答案为(),那么输出使得的最小正整数。可以证明答案一定为正有理数,并且这样的一定存在。
2 2
aa
aa
32770
3 6
i
dont
know
what
to
say
58261
提示
本题由个组成,设为这个字符串中,每个字符串长度的最大值。
对于:,分值为,时间限制为。
对于:,分值为,时间限制为。
对于:,分值为,时间限制为。
样例#1解释:
参数,那么可能的哈希为。
如果哈希第一个aa
采用的和第二个aa
的相同,那么答案为。
如果两个不相同,那么答案为。
分析发现这两种情况发生的概率相同,都是,那么答案的期望为。使得的最小正整数为。
样例#2解释:
求得答案为。使得的最小正整数为。
注意:本题允许手动开优化以避免被卡常数,方法如下:
%:pragma GCC optimize(2)
/*程序*/