题解 P2786 【英语1(eng1)- 英语作文】
这个题目主要是怕TLE,不用hash之类的东西,map就轻松搞定,但细节值得留意
首先先分析一下算法,每次读入一个字符,如果是间隔符就把ans加到前面这个单词上,否则我们创造一个字符串去累加这个单词
(很多细节导致WA)
底下AC代码:
#include <iostream>
#include <map>
#include <cstring>
#include <cstdio>
using namespace std;
map <string, int> mp;
char v;
string f = "", name;
int main()
{
long long n, p, ans = 0, x;
cin >> n >> p;
for(int i = 1; i <= n; i++)
{
cin >> name >> x;
mp[name] = x;
}
scanf("\n");//注意,这句话的用处在于高级词汇和文章之间的换行读入,因为读完高级词汇就直接进入while了。不加不会WA,但样例过不去(这……)
while(scanf("%c", &v) != EOF)
{
if(v == ' ' || v == ',' || v == '.' || v == '!' || v == '?')
{
ans = (mp[f] + ans) % p;//每次直接取模,以防溢出
f = "";//注意归0
}
else
{
f += v;
}
}
cout << ans << endl;
return 0;
}
当然,如果你喜欢30分,你也可以看这个暴力:
#include <cstdio>
#include <iostream>
#include <cstdio>
#include <unordered_map>
using namespace std;
unordered_map <string, int> mp;
char name[55];
string v;
int x;
int main()
{
int n, p, ans = 0;
scanf("%d %d", &n, &p);
for(int i = 1; i <= n; i++)
{
scanf("%s %d", name , &x);
mp[name] = x;
}
while(cin >> v)
{
for(unordered_map <string, int>::iterator it = mp.begin(); it != mp.end(); ++it)
{
if(v.find(it -> first) != string::npos)
{
ans += it -> second;
}
}
}
printf("%d\n", ans % p);
return 0;
}
我的暴力法子之前写的,有很多没考虑到,请大家包容
连stl的hash容器unordered都过不去,看来大赛以及日常刷题一定要注意时限、数据以及时间复杂度
求个赞
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现