您的位置:首页 > 产品设计 > UI/UE

UESTC_韩爷的梦 2015 UESTC Training for Search Algorithm & String<Problem N>

2015-05-13 00:59 429 查看

N-韩爷的梦

TimeLimit:200/100MS(Java/Others)MemoryLimit:1300/1300KB(Java/Others)

SubmitStatus

一天,韩爷去百度面试,面试官给了他这么一个问题。


给你2万个字符串,每个字符串长度都是100,然后把2万个字符串丢入一个set<string>g中,问最终set里含有多少个元素?
g是一个用来存储字符串、具有去重功能的容器,即相同字符串在g中只能保留一个。
两个字符串相等,当且仅当,长度一样且对应位置的字符都一样。

韩爷前晚没睡好,随手写了一个程序交给面试官,然后就gg了。

#include<iostream>
#include<string>
#include<set>
usingnamespacestd;
strings;
set<string>g;
intmain(){
for(intk=1;k<=20000;k++){
cin>>s;
g.insert(s);
}
cout<<g.size()<<endl;
return0;
}

韩爷醒来之后,发现这只是一个梦(还好只是个梦)。他回忆起梦中的面试官给他的内存限制和时间限制非常低,这么做肯定过不了,那么,现在你不在梦中,你能解决这个问题么?

Input

单case

每个case有且只有2万行,每一行包含一个字符串,每行字符串的长度都为100
(样例除外)


字符集:大写英文字母(A-Z),小写英文字母(a-z),数字(0-9)

Output

输出一个整数,表示最终set里含有多少个元素。

Sampleinputandoutput

SampleInputSampleOutput
aaAa
aaAa
bbbb
1234
bbbb
bbbb
ee09

4

Hint

样例只是样例,不在test中


注意时间限制和内存限制非常低


解题报告:

直接上哈希即可,双哈希单哈希都可以过,如果过不了,请换素数。。。。囧


#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
usingnamespacestd;
constintmaxn=2e4+100;
charstr[maxn];

voidhashinit(int&x1,int&x2)
{
x1=0x7FED7FED,x2=1;
intp1=1526597;
intp2=89834777;
intmod1=1e9+7;
intmod2=1e9+9;
unsignedintx3=0x23322322;
for(inti=1;i<=100;++i)
{
intval=str[i];
x1=(x1*p1+val)%mod1;
}
for(inti=1;i<=100;++i)
{
intval=str[i];
x2=(x2*p2+val)%mod2;
}
}

intmain(intargc,char*argv[])
{
inthash1[maxn];
inthash2[maxn];
intsize=0;
for(inti=1;i<=20000;++i)
{
scanf("%s",str+1);
intq1,q2;
hashinit(q1,q2);
hash1[size]=q1,
hash2[size++]=q2;
}
sort(hash1,hash1+size);
sort(hash2,hash2+size);
intc1=unique(hash1,hash1+size)-hash1;
intc2=unique(hash2,hash2+size)-hash2;
printf("%d\n",min(c1,c2));
return0;
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航