一 . 字符串哈希函数构造
字符串哈希通过牺牲很小的准确率,达到快速进行字符串匹配的效果
如题,给定 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;
- }
-
相关阅读:
Java基础抽象类详解
传输层 知识点总结
Linux中FTP安装
(翻译)JavaFX高级教程:JavaFX2.0的FXML语言
深入理解Docker:简化部署与管理的利器
[SpringBoot]配置文件①(配置文件格式、yaml配置及读取)
Golang学习之路6-goroutine并发
英国消费“避之不及”,东南亚“爱不释手”,TikTok Shop为何?
GBase 8s是否支持同城复制
下载文件时的文件名中文乱码问题,文件名丢失
-
原文地址:https://blog.csdn.net/gzkeylucky/article/details/126810509