暂无链接
AK的故事之英语学习篇(mistake)
【题目描述】
面对竞争日益激烈的社会,AK深感自己的英语水平实在是太差了,他决定在英语方面下苦工。这些日子里,AK每天都要背大量的英语单词,阅读很多英语文章。终于有一天,AK很高兴的对自己说:“我的英语已经没问题了!”他决定写一篇英语文章来显示自己的水平……
AK将自己的文章交给了他的英语老师Mr. Zhu,满以为Mr. Zhu会大加赞赏。谁知,Mr. Zhu却严厉的批评了AK。原来AK在这篇文章中拼错了许多许多单词。单词这一关都没过,别说文章的条理性了。
AK看到了自己的不足,决心从这篇文章开始重新奋斗!他首先要做的是找出文章中拼错的单词,并修正。但是这也不是一件容易的事,因为AK这篇文章写得太长了,而且拼错的单词也太多了,AK的水平太低,根本没法把拼错的单词都找出来。于是,AK找到了你,希望你帮助他完成这一任务。
【输入】
第一行一个整数N(N≤10000),表示字典中单词的个数。
第2~N+1行,每行一个单词,单词的长度不超过10。
第N+2行,列出了AK在文章中所用到的单词(一律为小写字母),单词间用空格分隔,单词的个数不会超过1000。
【输出】
一个整数,表示AK拼错的单词的数目。
注意:如果一个单词在字典中无法找到,那么我们就认为这个单词拼错了。
【输入样例】
2
love
this
i love this game
// 注意:如果出现两个相同的单词,且都拼错了,则计拼错单词数为2。
【输出样例】
2
题解
字符串哈希裸题,再使用tricky的读入技巧轻松AC。
隔壁的LPA大佬用set< string >做的,很强。。。
sto LPA大佬 orz
代码
#include<bits/stdc++.h>
#define ull unsigned long long
using namespace std;
const int mod=19997;
int n,ans;
vector<ull>tab[mod];
ull hash(char ch[])
{
ull r=0;
int k=strlen(ch);
for(int i=0;i<k;++i)
r+=ch[i]-'a'+1,r*=27;
return r;
}
void ins(ull x)
{
int nn=x%mod;
for(int i=tab[nn].size()-1;i>=0;--i)
if(tab[nn][i]==x)return;
tab[nn].push_back(x);
}
void in()
{
char ch[50];
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%s",ch),ins(hash(ch));
}
void check(ull x)
{
int nn=x%mod;
for(int i=tab[nn].size()-1;i>=0;--i)
if(tab[nn][i]==x)return;
ans++;
}
void ac()
{
char ch[50];
while(scanf("%s",ch)!=EOF)
check(hash(ch));
printf("%d",ans);
}
int main()
{
in();ac();
return 0;
}

AK决定提高英语水平,通过大量背单词和阅读英文文章。他尝试写了一篇英文文章但被老师指出许多拼写错误。为了找出并修正这些错误,采用字符串哈希的方法解决了问题。
298

被折叠的 条评论
为什么被折叠?



