一 . 字符串哈希函数构造
字符串哈希通过牺牲很小的准确率,达到快速进行字符串匹配的效果
如题,给定 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;
- }
-
相关阅读:
改进差分进化算法及其求解柔性作业车间调度问题(Python代码实现)
MySQL的内外连接
C++ 纠错题总结2
C# 基类中的虚函数调用基类的虚函数执行的是派生类实现的对应函数吗
C++程序开启大地址(虚拟内存),让32位程序使用4G内存的方,虚拟内存概念及寻址范围详解
MySQL运维7-Mycat分库分表之取模分片
[源码系列:手写spring] IOC第十四节:容器事件和事件监听器
向量数据库的分类概况
29.STM32红外遥控器
vue封装自己的组件库 02.封装dialog组件
-
原文地址:https://blog.csdn.net/gzkeylucky/article/details/126810509