今天做关于哈斯算法题解吧。 也是这个算法的模板题 就稍微讲一下我的认识。
题目如下。
一个经典的模板题。 算法核心就是哈希算法的基本应用。通过哈希算法。来做出每个字符串独特的哈希值。来达到区分字符串。这是一个模板。 也就是对于顺序的不同以每一次乘以一个数来解决。 因为对于这种连续的数学公式。 顺序会影响结果的大小。 对于位数就是每一次进行运算或加上一个自己随机设定的数值。 然后就可以实现这个算法。当然这个是不完全准确的。
ans=(ans*base+(f)s[i])%m+p;
就是上面这个式子。
总而言之,对于字符串所使用的哈希算法,还是对于这种算法的一个很浅显的理由。 可是让他们的哈希值尽可能的,不相等而已。完整代码如下,
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
typedef long long f;
f base=123;
f a[100000];
char s[100000];
int n,ans=1;
f m=12345678987654;
f p=555;
f hashe(char s[])
{
int len=strlen(s);
f ans=0;
for (int i=0;i<len;i++)
ans=(ans*base+(f)s[i])%m+p;
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",s);
a[i]=hashe(s);
}
sort(a,a+n);
for(int i=0;i<n-1;i++)
{
if(a[i]!=a[i+1])
ans++;
}
printf("%d",ans);
return 0;
}
然后再说一下我写的另外一道题吧。
题目如下。
这道题我用了我以前没有接触过的一个函数,就是map函数。 对于外部函数,我认为就是建立了一种映射的关系。或者说map函数所建立的就是一个自由化的数组。 对于数组来说,映射关系是以下标来实现。也就是说a[i]=?但是对于map来说。这个i 将不再是数字 而是 自定义数据类型,
所以对于以上这个题目,我们只需要用一个map 函数,再运用一些桶排的思想就可以解决了。具体就是先对于所有给出的名字进行标记。 然后再给出第二组数据的时候进行遍历。 如果是已经标记过了就输出,ok。 没有标记就输出wrong,然后对于每一个输出ok的操作之后,再对其进行标记。将其覆盖。在第二次遍历到这个数据的话。就输出repeat. 具体的代码如下,
#include<map>
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
map<string,int>a;
char s[10000000];
int n,m;
int main(){
scanf("%d",&n);
while(n--){
cin>>s;
a[s]=1;
}
scanf("%d",&m);
while(m--){
cin>>s;
if(a[s]==1){
printf("OK\n");
a[s]=2;}
else if(a[s]==2){
printf("REPEAT\n"); }
else printf("WRONG\n");
}
return 0;
}
今天的学习总结就到这里了。