zoukankan      html  css  js  c++  java
  • 洛谷 P3370 【模板】字符串哈希 (set||map||哈希||字典树(mle)

    P3370 【模板】字符串哈希

    题目描述

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

    #友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:)

    输入格式

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

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

    输出格式

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

    输入输出样例

    INPUT:
      5
    abc
    aaaa
    abc
    abcc
    12345
    OUTPUT:  4

    可好玩一题,之前学长讲字符串的ppt里截来的,因为题目很简单所以可以用很多方法写,stl里的map和set,哈希都行,顺便学了一下字典树。

    之前想了个存储字符串然后sort一遍再遍历前后比较判断总数的思路,被嫌弃了呜呜(也是,方法太笨了

    以下是四个写法(再次强调字典树这题mle了○| ̄|_,

    #include<bits/stdc++.h>
    using namespace std;
    set<string> s;
    int main()
    {
        string s1;
        int n;cin>>n;
        while(n--){
            cin>>s1;s.insert(s1);
        }
        cout<<s.size()<<endl;
    }
    #include<bits/stdc++.h>
    const int  mod=100003;
    const int N = 1e6+2;
    int a[N],n,k;
    using namespace std;
    map<string,int>mp;
    int main()
    {
        string s;
        cin>>n;
        while(n--){
            cin>>s;mp[s]=1;
        }
        cout<<mp.size()<<endl;
        return 0;
    }
    #include<bits/stdc++.h>
    const int  mod=100003;
    const int N = 1e7+2;
    int a[N],n,k;
    using namespace std;
    map<string,int>mp;
    int main()
    {
        string s;
        cin>>n;
        int ans=0,tot=0;
        while(n--){
            int p = 331,x=0;
            cin>>s;
            for(int i = 0;i < s.size();++i){
                x=x*p+s[i];
            }
            a[++tot]=x;
        }
        sort(a+1,a+1+tot);
        cout<<unique(a+1,a+1+tot)-a-1<<endl;
        return 0;
    }
    #include<bits/stdc++.h>
    const int  mod=100003;
    const int N = 1e5+2;
    int a[N],n,k;
    using namespace std;
    struct node{
        bool r= 0;
        node *next[75];
    };
    node root;
    int ans = 0;char s[1500];
    void build_trie(){
        int l = strlen(s);
        node *p=&root;
        int flag = 0;
        for(int i = 0;i < l;++i){
            if(p->next[s[i]-'0']==NULL){
                p->next[s[i]-'0'] = new node;
            }
            p=p->next[s[i]-'0'];
        }
        if(p->r > 0)flag =1;
        p->r = 1;
        if(flag==1)return ;
        else ans++;
    }
    int main()
    {
        int T;scanf("%d",&T);
        while(T--){
            scanf("%s",s);build_trie();
        }
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    职场之道
    AlphaBlend
    感动前行——给医学媳妇写的演讲稿(非IT类)
    高等数学积分公式大全
    分析Model2系统心得
    【软考】(六)关系代数
    飞鸽传书官方站点 创立黑马程序猿训练营
    实现简单的二级级联
    const和readonly差别
    Chord算法(原理)
  • 原文地址:https://www.cnblogs.com/h404nofound/p/11656765.html
Copyright © 2011-2022 走看看