• P3370 【模板】字符串哈希【字符串哈希】


    题目

    https://www.luogu.com.cn/problem/P3370

     思路

    大致的方法就是先自己预定一个base基值,将字符串的每一位与base相乘,解决冲突的方法就是使用自然溢出、双哈希等

    代码

    自然溢出

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    using namespace std;
    #define ull unsigned long long
    ull  base = 131;
    ull list[20000];
    int answer = 0,n;
    long long a[20000];
    int hashsssss(string a)
    {
        ull ans = 0;
        for (int i = 0; i < a.length(); i++)
        {
            ans = ans * base+(ull)a[i];
        }
        return ans & 0x7fffffff;
    }
    int main()
    {
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            string temp;
            cin >> temp;
            a[i] = hashsssss(temp);
        }
        sort(a, a + n);
        int count = 1;
        for (int i = 0; i < n - 1; i++)
            if (a[i] != a[i + 1])count++;
        printf("%d", count);
    }

    双哈希

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    using namespace std;
    #define ull unsigned long long
    ull  base = 131;
    ull mod1 = 192837423;
    ull mod2 = 192348236;
    struct node
    {
        ull x;
        ull y;
    }a[20000];
    int answer = 0, n;
    bool cmp(struct node &a, struct node &b)
    {
        if (a.x == b.x)return a.y > b.y;
        else return a.x > b.x;
    }
    int hashsssss(string a)
    {
        ull ans = 0;
        for (int i = 0; i < a.length(); i++)
        {
            ans = ans * base + (ull)a[i]%mod1;
        }
        return ans;
    }
    int hashsssss2(string a)
    {
        ull ans = 0;
        for (int i = 0; i < a.length(); i++)
        {
            ans = ans * base + (ull)a[i] % mod2;
        }
        return ans;
    }
    
    int main()
    {
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            string temp;
            cin >> temp;
            a[i].x = hashsssss(temp);
            a[i].y = hashsssss2(temp);
        }
        sort(a, a + n,cmp);
        int count = 1;
        for (int i = 0; i < n - 1; i++)
            if (a[i].x != a[i + 1].x|| a[i].y != a[i + 1].y)count++;
        printf("%d", count);
    }
  • 相关阅读:
    所有时间测试函数
    时间函数应用 time
    50个c/c++源代码网站
    ASN.1详解
    SNMP协议
    SNMP协议详解
    大数据需要建立规则和标准
    常用的三层架构设计
    构建大型网站架构十步骤
    iOS 应用程序内部国际化,不跟随系统语言
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/13205074.html
Copyright © 2020-2023  润新知