题目描述 如题,给定 � N 个字符串(第 � i 个字符串长度为 � � M i ,字符串内包含数字、大小写字母,大小写敏感),请求出 � N 个字符串中共有多少个不同的字符串。 输入格式 第一行包含一个整数 � N ,为字符串的个数 接下来 � N 行每行包含一个字符串,为所提供的字符串 输出格式 输出包含一行,包含一个整数,为不同的字符串个数 样例输入 5 abc aaaa abc abcc 12345 样例输出 4 数据范围 � ≤ 10000 N≤10000, � � ≈ 1000 M i ≈1000, � � � � ≤ 1500 M max ≤1500 时空磁盘限制(运行时) 时间限制: 1000 ms 内存空间限制: 488 MiB 磁盘空间限制: 无限制。请通过自建哈希表来实现要求,并用C++语言写出目标代码
时间: 2024-01-16 17:05:47 浏览: 151
js-utils-给定两个字符串s和t
题目已经给了时空磁盘限制,我们可以采用分块的方式来实现哈希表。具体做法是,将元素分成若干块,对每一块采用数组模拟哈希表,最后统计不同的字符串数目。
以下是代码实现:
```cpp
#include <iostream>
#include <cstring>
using namespace std;
const int N = 10010, K = 200, M = 1010, P = 131;
int n;
int h[K][N], e[K][N], ne[K][N], idx;
char str[N][M];
void insert(char str[])
{
int len = strlen(str);
int hash = 0;
for (int i = 0; i < len; i++)
hash = hash * P + str[i];
int k = hash % K;
for (int i = h[k][0]; i != -1; i = ne[k][i])
if (strcmp(str, ::str[e[k][i]]) == 0)
return;
e[k][idx] = idx;
strcpy(::str[idx], str);
ne[k][idx] = h[k][0];
h[k][0] = idx++;
}
int main()
{
memset(h, -1, sizeof h);
cin >> n;
for (int i = 0; i < n; i++) {
cin >> str[i];
insert(str[i]);
}
int cnt = 0;
for (int i = 0; i < K; i++)
for (int j = h[i][0]; j != -1; j = ne[i][j])
cnt++;
cout << cnt << endl;
return 0;
}
```
其中,h数组表示哈希表(桶),e和ne数组表示链式前向星,idx表示元素个数,K表示块数(这里取200),M表示字符串最大长度(这里取1010)。字符串的哈希值计算采用了P进制的方法,这里P取131。时间复杂度为O(NM/K),空间复杂度为O(NM),磁盘空间复杂度为O(KNM)。
阅读全文