#P4235. Hash?
Hash?
题目背景
zhoutb2333学习了哈希算法,他于是去统计给定一些字符串,其中有多少个本质不同的字符串。
但是zhoutb2333突发奇想,如果哈希采用的每次随机,那么结果会变成什么样呢?
辣鸡出题人又出锅了!subtask3的数据有问题,现在统一将模数改为65537
题目来源:zhoutb2333
题目描述
他通过某种办法,获得了一个函数:int Rand(int x),它会等概率地返回一个 中的整数。
他写下了这样的代码:
#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 解释:
求得答案为 。使得 的最小正整数 为 。