【题目】
题目背景:
蒟蒻 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 2−n+1 行,每行包含一个单词 a i a_i ai(长度为 l i l_i li)和一个整数 b i b_i bi,其中 b i b_i bi 表示该单词的含金量( 0 < b i ≤ 100000 0<b_i\le100000 0<bi≤100000)
接下来直到输入结束的若干行为一篇英语作文,其中包含共计 m m m 个单词,以及若干的分隔符(分隔符包含且仅包含 "    " "\; " ""、 " , " "," ","、 " . " "." "."、 " ! " "!" "!"、 " ? " "?" "?")
输出格式:
一行,包含一个整数,为该文章的总含金量对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 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 次,请注意这是一篇英语作文,一切以单词为最小单位。
此题目中大小写敏感。
数据范围(设所有单词的最大长度为 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;
}