题目大意:
给定N个字符串(第i个字符串长度为Mi,字符串内包含数字、大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串。
解题思路:
Hash or Tire
Hash比较简单根本原因是——我不会Tire我太蒻了
至于怎么做:
我们首先给每个字符串一个数加上自然溢出,这些数重复的概率就会十分的小
然后把这些数加入set里,(set自动去重)输出set的长度就好了
为了防止有人Copy我的程序直接交造成不利影响我在程序里加了一些神奇的东西~
Accepted code:
神TMset去重骚操作
#include<set>
#include<cstdio>
#include<cstring>
#define base 233
#define ull unsigned long long
using namespace std;
char c[10005];
ull Hash(char c[])
{
int len=strlen(c); ull ans=0;
for (int i=0;i<len;i++)
ans=ans*base+(ull)c[i];
return ans&0x7fffffff;//自然溢出
}
set<ull> a;
int main()
{
int n; scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%s",c);
a.insert(Hash(c));
}
printf("%d",a.size());
return 0;
}
无set
#include<cstdio>
#include<cstring>
#include<algorithm>
#define base 233
#define ull unsigned long long
using namespace std;
ull a[10005];
char c[10005];
ull Hash(char c[])
{
int len=strlen(c); ull ans=0;
for (int i=0;i<len;i++)
ans=ans*base+(ull)c[i];
return ans&0x7fffffff;
}
int main()
{
int n; scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%s",c);
a[i]=Hash(c);
}
sort(a+1,a+n+1);
int ans=1;
for (int i=1;i<n;i++)
if (a[i]!=a[i+1])
ans++;
printf("%d",ans);
}