一 . 字符串哈希函数构造
字符串哈希通过牺牲很小的准确率,达到快速进行字符串匹配的效果
如题,给定 N 个字符串(第 i 个字符串长度为 ,字符串内包含数字、大小写字母,大小写敏感),请求出 N 个字符串中共有多少个不同的字符串。
第一行包含一个整数 N,为字符串的个数。
接下来 N 行每行包含一个字符串,为所提供的字符串。
输出包含一行,包含一个整数,为不同的字符串个数。
输入 #1
5 abc aaaa abc abcc 12345
输出 #1
4
对于 30% 的数据:,,。
对于 70% 的数据:,,。
对于 100% 的数据:,,。
- #include
- #include
- #include
- #include
- #define ll unsigned long long
- using namespace std;
- int n;
- const int maxn=1e7+5,base=131; //base表示进制数
- const ll int mod=19260817891;
- ll int a[maxn]; //a[]即哈希表
- int res=0;
- char s[maxn];
- inline ll int hash_check(char s[])
- {
- ll int len=strlen(s),ans=0;
- for(int i=0;i
- {
- ans=ans*base+(ll)s[i]; //利用自然数溢出,即超过2*64自动溢出,节省时间
- }
- return ans;
- }
-
- int main()
- {
- scanf("%d",&n);
- for(int i=1;i<=n;++i)
- {
- scanf("%s",s);
- a[i]=hash_check(s);
- }
- sort(a+1,a+n+1);
- for(int i=1;i<=n;++i)
- {
- if(a[i]!=a[i+1]) res++;
- }
- printf("%d",res);
- return 0;
- }
方法2:单hash表
该题与自然溢出唯一不同的地方是:在进行散列的时候,与一个很大的整数进行取模。
- #include
- #include
- #include
- #include
- #define ll unsigned long long
- using namespace std;
- int n;
- const int maxn=1e7+5,base=131;
- const ll int mod=19260817891;
- ll int a[maxn];
- int res=0;
- char s[maxn];
- inline ll int hash_check(char s[])
- {
- ll int len=strlen(s),ans=0;
- for(int i=0;i
- {
- ans=(ans*base+(ll)s[i])%mod; //唯一的不同之处
- }
- return ans;
- }
-
- int main()
- {
- scanf("%d",&n);
- for(int i=1;i<=n;++i)
- {
- scanf("%s",s);
- a[i]=hash_check(s);
- }
- sort(a+1,a+n+1);
- for(int i=1;i<=n;++i)
- {
- if(a[i]!=a[i+1]) res++;
- }
- printf("%d",res);
- return 0;
- }
-
相关阅读:
服务器获取Jar包运行目录
认识京东联盟API,获取APPkey和APPsecret|直接调用KEY方式
[附源码]计算机毕业设计springboot线上评分分享平台
Pandas 数据处理 类别数据和数值数据
【1++的C++进阶】之C++11(一)
NLP - 神经网络与反向传播
【222】MyQSL技术内幕 InnoDB 存储引擎第二版 笔记
【TypeScript笔记】01 - TS初体验 && TS常用类型
angular:简单实现图片如果超过屏幕高度则滚动置顶;没超过则水平垂直居中
FPGA代码设计规范一些探讨
-
原文地址:https://blog.csdn.net/gzkeylucky/article/details/126810509