一 . 字符串哈希函数构造
字符串哈希通过牺牲很小的准确率,达到快速进行字符串匹配的效果
如题,给定 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;
- }
-
相关阅读:
FCN学习笔记
五、数据库连接池解析与编写 —— TinyWebServer
panads基础入门
小程序+egg来实现获取用户手机号
百度SEO优化基本原理(掌握SEO基础,提高网站排名)
约瑟夫环问题——《算法》1.1.37的解法
MyBatis基础之概念简介
为什么企业要选择使用报修工单管理系统?
Python 自定义模块和包设计英语生词本(文件版)
Vue引入异步组件
-
原文地址:https://blog.csdn.net/gzkeylucky/article/details/126810509