【洛谷 2786】英语1(eng1)- 英语作文

【题目】

传送门

题目背景:

蒟蒻 HansBug 在英语考场上,挠了无数次的头,可脑子里还是一片空白。

题目描述:

眼下出现在 HansBug 蒟蒻面前的是一篇英语作文,然而智商捉急的 HansBug 已经草草写完了,此时他发现离考试结束还有 40min,于是他打算估计一下这篇共有 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(长度为 l i l_i li)和一个整数 b i b_i bi,其中 b i b_i bi 表示该单词的含金量( 0 &lt; b i ≤ 100000 0&lt;b_i\le100000 0<bi100000

接下来直到输入结束的若干行为一篇英语作文,其中包含共计 m m m 个单词,以及若干的分隔符(分隔符包含且仅包含 &quot; &ThickSpace; &quot; &quot;\; &quot; "" &quot; , &quot; &quot;,&quot; "," &quot; . &quot; &quot;.&quot; "." &quot; ! &quot; &quot;!&quot; "!" &quot; ? &quot; &quot;?&quot; "?"

输出格式:

一行,包含一个整数,为该文章的总含金量对P的模。

样例数据:

【样例 1 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.

输出
16

【样例 2 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.

输出
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 次,请注意这是一篇英语作文,一切以单词为最小单位。

此题目中大小写敏感。

数据范围(设所有单词的最大长度为 Lmax):
在这里插入图片描述


【分析】

比较简单的一道题,可以用 m a p map map 水过

把所有高级词汇以及它的含金量加进 m a p map map

然后在文章中枚举每个单词,统计分数

最后取个模就可以了


【代码】

#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
string s;
map<string,int>Score;
bool check(char x)
{
	if(x>='0'&&x<='9')  return true;
	if(x>='a'&&x<='z')  return true;
	if(x>='A'&&x<='Z')  return true;
	return false;
}
int solve(string s)
{
	string st="";
	int i,ans=0,l=s.length();
	s[l]='.';
	for(i=0;i<=l;++i)
	{
		if(!check(s[i]))
		{
			ans+=Score[st],st="";
			continue;
		}
		st+=s[i];
	}
	return ans;
}
int main()
{
	int n,p,i,x,ans=0;
	scanf("%d%d",&n,&p);
	for(i=1;i<=n;++i)
	{
		cin>>s;
		scanf("%d",&x);
		Score[s]=x;
	}
	while(cin>>s)
	  ans=(ans+solve(s))%p;
	printf("%d",ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值