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; }