P2786 英语1(eng1)- 英语作文
P2786 英语1(eng1)- 英语作文
题目背景
蒟蒻 HansBug 在英语考场上,挠了无数次的头,可脑子里还是一片空白。
题目描述
眼下出现在 HansBug 蒟蒻面前的是一篇英语作文,然而智商捉急的 HansBug 已经草草写完了,此时他发现离考试结束还有 40 40 40 分钟,于是他打算估计一下这篇共有 M M M 个单词的英语作文的含金量如何。众所周知的是,在中高考英语作文中使用高级词汇可以有效提高文章的含金量,从而获得更好的分数。已知蒟蒻HansBug知道 N N N 个高级词汇,该词汇为 A i A_i Ai(词汇长度为 L i L_i Li ,包含数字、大小写字母),该高级词汇的含金量为 B i B_i Bi,则该高级词汇每出现一次便可增加 B i B_i Bi 的含金量。可是他脑细胞和 RP 已经消耗殆尽,所以这个伟大的任务就交给你啦!
输入格式
第一行包含两个整数 N N N 和 P P P , N N N 表示HansBug共知道的高级词汇个数, P P P 为模数
第 2 − N + 1 2-N+1 2−N+1行,每行包含一个单词 A i A_i Ai (长度为Li)和一个整数 B i B_i Bi ,其中 B i ( 0 < B i ≤ 1 0 5 ) B_i(0<B_i\le 10^5) Bi(0<Bi≤105) 表示该单词的含金量
接下来直到输入结束的若干行为一篇英语作文,其中包含共计 M M M 个单词,以及若干的分隔符(分隔符包含且仅包含,
、.
、!
、?
)
输出格式
一行,包含一个整数,为该文章的总含金量对 P P P 的模。
输入输出样例 #1
输入 #1
5 99
hansbug 1
kkksc03 2
yyy 3
absi2011 4
lzn 100
hansbug is a juruo!but absi2011 not.!?!
one day absi2011 laughed at yyy and hansbug.
then kkksc03 and lzn blamed him for that.
输出 #1
16
输入输出样例 #2
输入 #2
5 99
yyyy 1
kkksc03 2
yyy 3
absi2011 4
lzn 100
yyyy is a juruo!but absi2011 not.!?!
one day absi2011 laughed at yyy and yyyy.
then kkksc03 and lzn blamed him for that.
输出 #2
16
说明/提示
样例 1 1 1 中,共计出现了 2 2 2 次hansbug
、 2 2 2 次absi2011
、 1 1 1 次 yyy
、 1 1 1 次kkksc03
、 1 1 1 次 lzn
,所以总含金量为 1 × 2 + 2 × 4 + 3 × 1 + 4 × 1 + 100 × 1 = 115 1\times2+2\times4+3\times1+4\times1+100\times1=115 1×2+2×4+3×1+4×1+100×1=115,对 99 99 99 取模就是 16 16 16 。
样例 2 2 2 中,和样例 1 1 1 基本一样,值得注意的是整体的 yyyy
不可以被认为是 yyy
出现 2 2 2 次,请注意这是一篇英语作文,一切以单词为最小单位。
此题目中大小写敏感。
数据范围(设所有单词的最大长度为 L m a x Lmax Lmax ):
题解
本题是一个红黑树的题目,利用前面所讲的红黑树中的map来解决。
利用map<string,int>即<单词,含金量>便可以很容易解决。本题的关键问题主要是细节上的处理。
这是根据上面的思路写下的初版代码:
#include <iostream>
#include <string>
#include <map>
using namespace std;map<string,int> mp;
int b;int main(){int n,p;cin >> n >> p;while(n--){string str;int b;cin >> str >> b;mp[str] = b;}string s;while(cin >> s){if(mp.count(s)) b += mp[s];}cout << b % p << endl;return 0;
}
实际得分:0
题目中提到:包含共计 M M M 个单词,以及若干的分隔符(分隔符包含且仅包含,
、.
、!
、?
)。很显然,在这版解法中,我们以字符串为单位进行读取,而分隔符也被当作了字符串,因此会导致无法正确以单词为单位进行读取,从而导致错误。
因此,我们需要以字符串为单位进行读取,再转换为单词。
正解
#include <iostream>
#include <string>
#include <map>
using namespace std;map<string,int> mp;
int b;bool low(char x){if((x >= '0' && x <= '9')||(x >= 'a' && x <= 'z')||(x >= 'A' && x <= 'Z')){return true;}else return false;
}int main(){int n,p;cin >> n >> p;while(n--){string str;int b;cin >> str >> b;mp[str] = b;}char ch;string s;while(scanf("%c",&ch) != EOF){if(low(ch)){s += ch;}else{b += mp[s];s = "";}}cout << b % p << endl;return 0;
}