字符串哈希 - # P3370 【模板】字符串哈希

题目描述

如题,给定 \(N\) 个字符串(第 \(i\) 个字符串长度为 \(M_i\),字符串内包含数字、大小写字母,大小写敏感),请求出 \(N\) 个字符串中共有多少个不同的字符串。

友情提醒:如果真的想好好练习哈希的话,请自觉。

输入格式

第一行包含一个整数 \(N\),为字符串的个数。

接下来 \(N\) 行每行包含一个字符串,为所提供的字符串。

输出格式

输出包含一行,包含一个整数,为不同的字符串个数。

输入输出样例 #1

输入 #1

5
abc
aaaa
abc
abcc
12345

输出 #1

4

说明/提示

数据范围

对于 \(30\%\) 的数据:\(N\leq 10\)\(M_i≈6\)\(M_{\max}\leq 15\)

对于 \(70\%\) 的数据:\(N\leq 1000\)\(M_i≈100\)\(M_{\max}\leq 150\)

对于 \(100\%\) 的数据:\(N\leq 10000\)\(M_i≈1000\)\(M_{\max}\leq 1500\)

样例说明

样例中第一个字符串 \(\tt{abc}\) 和第三个字符串 \(\tt{abc}\) 是一样的,所以所提供字符串的集合为 \(\{\tt{aaaa},\tt{abc},\tt{abcc},\tt{12345}\}\),故共计 \(4\) 个不同的字符串。

#include <bits/stdc++.h>
using namespace std;
#define LL long long

// 双哈希模数、基数
const LL MOD1 = 1000000007;
const LL MOD2 = 1000000009;
const int BASE = 131;

int main() {


    int n;
    cin >> n;
    set<pair<LL, LL>> st; // 集合自动去重,存(哈希1,哈希2)

    while (n--) {
        string s;
        cin >> s;
        LL h1 = 0, h2 = 0;
        // 滚动求整串双哈希
        for (char c : s) {
            int x = c;
            h1 = (h1 * BASE + x) % MOD1;
            h2 = (h2 * BASE + x) % MOD2;
        }
        st.insert({h1, h2}); // 插入哈希对,重复自动舍弃
    }
    cout << st.size() << endl; // 集合元素个数=不同字符串数量
    return 0;
}
posted @ 2026-06-04 17:04  alice_ss  阅读(7)  评论(0)    收藏  举报
//雪花飘落效果