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 2N+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<Bi105) 表示该单词的含金量

接下来直到输入结束的若干行为一篇英语作文,其中包含共计 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 2hansbug 2 2 2absi2011 1 1 1yyy 1 1 1kkksc03 1 1 1lzn ,所以总含金量为 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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值