题解 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都过不去,看来大赛以及日常刷题一定要注意时限、数据以及时间复杂度

求个赞

posted @   HappyBobb  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示