• 洛谷 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;
    }
  • 相关阅读:
    c:forTokens标签循环输出
    jsp转long类型为date,并且格式化
    spring中@Param和mybatis中@Param使用区别(暂时还没接触)
    734. Sentence Similarity 有字典数组的相似句子
    246. Strobogrammatic Number 上下对称的数字
    720. Longest Word in Dictionary 能连续拼接出来的最长单词
    599. Minimum Index Sum of Two Lists两个餐厅列表的索引和最小
    594. Longest Harmonious Subsequence强制差距为1的最长连续
    645. Set Mismatch挑出不匹配的元素和应该真正存在的元素
    409. Longest Palindrome 最长对称串
  • 原文地址:https://www.cnblogs.com/h404nofound/p/11656765.html
Copyright © 2020-2023  润新知