0
点赞
收藏
分享

微信扫一扫

2.9日学习总结

小亦同学321 2022-02-10 阅读 71

今天做关于哈斯算法题解吧。 也是这个算法的模板题 就稍微讲一下我的认识。

题目如下。

 一个经典的模板题。 算法核心就是哈希算法的基本应用。通过哈希算法。来做出每个字符串独特的哈希值。来达到区分字符串。这是一个模板。 也就是对于顺序的不同以每一次乘以一个数来解决。 因为对于这种连续的数学公式。 顺序会影响结果的大小。 对于位数就是每一次进行运算或加上一个自己随机设定的数值。 然后就可以实现这个算法。当然这个是不完全准确的。

 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;
}

今天的学习总结就到这里了。

举报

相关推荐

2.9模拟总结

2.17日学习总结

2.14日学习总结

1.20日学习总结

1.18日学习总结

1.19日学习总结

1月23日学习总结

0 条评论