学习目录
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值一样肯定就是同一字符串,将出现的(相同字符串)的情况进行统计,输入数量减去重复数量就是字符串的种类数。