2022/2/9学习报告

学习目录

1.刷题

2.听学长讲课

题目

1.

P3370 【模板】字符串哈希

题目描述

如题,给定 NN 个字符串(第 ii 个字符串长度为 M_iMi​,字符串内包含数字、大小写字母,大小写敏感),请求出 NN 个字符串中共有多少个不同的字符串。

友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:)

输入格式

第一行包含一个整数 NN,为字符串的个数。

接下来 NN 行每行包含一个字符串,为所提供的字符串。

输出格式

输出包含一行,包含一个整数,为不同的字符串个数。

输入输出样例

输入 #1复制

5
abc
aaaa
abc
abcc
12345

输出 #1复制

4
#include<stdio.h>
#include<string.h>
int len[2000];//记录当前长度的字符串有几个(len[10]存的就是长度为10的字符串) 
int wei[10000][10000];//记录字符存入散列表后的位置 
int hash1[10000],hash2=0;
char s[10000][10000];//存输入的字符串 
int main()
{
	int sum,n;
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%s",s[i]);
		int slen;
		slen=strlen(s[i]);
		len[slen]++;//记录当前长度字符串的数组++
		wei[slen][len[slen]]=i;//长度为ln的字符串记录下位置
		for(int j=1;j<=slen;j++)
		{
			int A;
			A=s[i][j]-'0';
			hash2=hash2*10000+A;
		}
		hash1[i]=hash2;//记录下每个串的值k以便后续遇到长度一样的时候进行判断 
		for(int j=1;j<len[slen];j++)//对每个与当前字符串长度相同字符串开始检验 
		{
			if(hash1[wei[slen][j]]==hash2)//如果找到hash值相同的,那就是一样的字符串
			{
				sum++;
				break;
			}
		}
		hash2=0;//hash值清零以便对下一个输入的字符串进行处理 
	}
	printf("%lld",n-sum);//用输入的的减去重复的就得到一共有几种 
	return 0;
}

题解:对于输入的字符串,首先对其长度进行判断,并将其存入对应的2维字符串中,同时,记录该长度字符串数量的数组+1(如存入了一个长度为3的字符串后,len[3]+1),存入后,对字符串进行其hash值的判断,长度不一样的肯定不是同一字符串,长度一样的就对其hash值进行判断,hash值一样肯定就是同一字符串,将出现的(相同字符串)的情况进行统计,输入数量减去重复数量就是字符串的种类数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值