1 条题解

  • 0
    @ 2024-3-20 13:04:10

    哈希的过程,其实可以看作​对一个串的单向加密过程​,并且需要保证所加的密​不能冲突​(就像不能让隔壁老王轻易地用它家的钥匙打开你家门一样QWQ) 不过有的题确实会卡哈希冲突 主要思路是选取恰当的进制,可以把字符串中的字符看成一个大数字中的每一位数字,不过比较字符串和比较大数字的复杂度并没有什么区别(高精数的比较也是O(n)的),但只要把它对一个数取模,然后认为取模后的结果相等原数就相等,那么就可以在一定的错误率的基础上O(1)进行判断了。 关于进制的选择实际上非常自由,大于所有字符对应的数字的最大值,不要含有模数的质因子(那还取什么模),比如一个字符集是a到z的题目,选择27、233都是可以的。


    这里用的就是常见的进制哈希

    #include<algorithm>
    #include<iostream>
    #include<string>
    using namespace std;
    int n;
    const long long mod=1e9+911;//取模的大质数
    const int base=233;//进制位
    long long ha(string a){
        long long ans=0;
        for(int i=0; i<a.length(); i++){
            ans=(ans*base+a[i])%mod;//标准的字符哈希
        }
        return ans;
    }
    string s;
    long long k[150000];
    int main(){
        cin>>n;
        for(int i=0; i<n; i++){
            cin>>s;
            k[i]=ha(s);
        }
        sort(k,k+n);//答案排序
        int ans=0;
        for(int i=0; i<n; i++){
            if(k[i]!=k[i+1])ans++;//答案累加
        }
        cout<<ans;
        return 0;
    }
    
    • 1

    信息

    ID
    2306
    时间
    1000ms
    内存
    128MiB
    难度
    2
    标签
    递交数
    39
    已通过
    17
    上传者