洛谷P2786 英语1(eng1)- 英语作文

题目背景

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

题目描述

眼下出现在HansBug蒟蒻面前的是一篇英语作文,然而智商捉急的HansBug已经草草写完了,此时 他发现离考试结束还有40min,于是他打算估计一下这篇共有M个单词的英语作文的含金量如何。众所周知的是,在中高考英语作文中使用高级词汇可以有效提 高文章的含金量,从而获得更好的分数。已知蒟蒻HansBug知道N个高级词汇,该词汇为Ai(词汇长度为Li,包含数字、大小写字母),该高级词汇的含 金量为Bi,则该高级词汇每出现一次便可增加Bi的含金量。可是他脑细胞和RP已经消耗殆尽,所以这个伟大的任务就交给你啦!

输入输出格式

输入格式:

第一行包含两个整数N和P,N表示HansBug共知道的高级词汇个数,P为模数

第2-N+1行,每行包含一个单词Ai(长度为Li)和一个整数Bi,其中Bi表示该单词的含金量(0<Bi<=100000)

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

输出格式:

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

输入输出样例

输入样例#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:
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中,共计出现了2次hansbug、2次absi2011、1次yyy、1次kkksc03、1次lzn,所以总含金量为1*2+2*4+3*1+4*1+100*1=115,对99取模就是16。

样例2中,和样例1基本一样,值得注意的是整体的yyyy不可以被认为是yyy出现2次,请注意这是一篇英语作文,一切以单词为最小单位。

  这题又是水题,主要可以体会一下map的方便,还让我回忆下c语言自带的几个有用的字符处理函数。

代码如下:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 int n,p,ans;
 5 string a;
 6 char t;
 7 map<string,int>s;//用map来存储对应单词和它的含金量
 8 int main()
 9 {
10     //freopen("de.txt","r",stdin);
11     ans=0;
12     scanf("%d%d",&n,&p);
13     for (int i=0;i<n;++i)
14     {
15         cin>>a;
16         scanf("%d",&s[a]);
17     }
18     getchar();
19     a="";
20     while (scanf("%c",&t)==1)
21     {
22         if (!isalnum(t))//这个函数的意思是该字符是否为数字或字母
23         {
24 
25             //cout<<a<<endl;
26             //printf("%d
",s[a]);
27             ans=(ans+s[a])%p;
28             a="";
29         }
30         else
31         a+=t;
32     }
33     printf("%d
",ans);
34     return 0;
35 }
36 
37 //isalpha(ch),该字符是否为字母
38 //isdigit(ch),该字符是否为数字
原文地址:https://www.cnblogs.com/agenthtb/p/5846303.html