洛谷 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\n",ans);
    return 0;
}

 

posted @ 2019-10-11 20:44  小草今天又在摸鱼吗  阅读(250)  评论(0编辑  收藏  举报