AK的故事之英语学习篇(mistake)

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

暂无链接

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShadyPi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值