题解 P2786 【英语1(eng1)- 英语作文】
本题解使用std::map。
其实非常简单,我们只要把所有高级词汇和它的含金量存在map里,输入文章的时候计算,直接输出结果就OK了。需要注意的就是输入的处理。
正解应该是平衡树吧,我也不清楚,看tag知道的。但map内置红黑树,所以效率不会低很多。
具体见代码。
#include<iostream>
#include<map>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
ll n,p;
map<string,ll>a;
ll ans;
int main()
{
scanf("%lld%lld",&n,&p);
for(int i=1;i<=n;i++)
{
string word;
ll value;
cin>>word>>value;
a[word]=value;
//word即高级词汇,value即其含金量
}
string t="";
char c;
//t存储词汇
//c是用于输入的临时变量
while(scanf("%c",&c)!=EOF)
{
if(!(isdigit(c)||isalpha(c)))
{
//不是数字,也不是字母,那就是分隔符或者空格回车之类的
ans=((ans%p)+(a[t]%p))%p;
//那么就更新答案,把上一个词的含金量加上
//如果上一个词不是高级词汇,那么在map里对应的含金量就是0
//相当于没有变化
//为了答案不溢出,随时取模
t="";
//还原,以便记录下一个词
}
else t+=c;
}
printf("%lld\n",ans);
return 0;
}