洛谷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\n",s[a]); 27 ans=(ans+s[a])%p; 28 a=""; 29 } 30 else 31 a+=t; 32 } 33 printf("%d\n",ans); 34 return 0; 35 } 36 37 //isalpha(ch),该字符是否为字母 38 //isdigit(ch),该字符是否为数字