2023.04.17 定时测试随笔 T1

发布时间 2023-04-17 13:12:15作者: florence25

T1 P2264 情书

传送门:洛谷P2264

这道题需要注意几个关键点:

  • 不管大小写,所以我们就把所有的英文字符都给改成大写或者小写;

  • ' . ' 是一个句子的结束,相同的单词在不同的句子里都可以加分,我们要判断句子结束;

  • 关键词判重,一个单词在一个句子里不能重复加分;

对于 ① 我们可以在小写字母上 \(-32\) 变成大写字母;

对于 ② 我们就找 ' . ' 就行了;

对于 ③ 我们用一个 \(vis[]\) 数组记录;


很简单的一个题;

贴代码:

#include <bits/stdc++.h>

using namespace std;

const int maxn = 100 + 5;
string a[maxn], s, sm;
int n, ans, len, vis[maxn];

void read() {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++ i) {
        cin >> a[i];
        for (int j = 0; j < a[i].length(); ++ j)
            if (a[i][j] >= 97 && a[i][j] <= 122) a[i][j] -= 32;
    }
    getchar();//一定要写;
    getline(cin, s);//可以读入空格;
    int len = s.length();
    for (int i = 0; i < len; ++ i)
        if (s[i] >= 97 && s[i] <= 122) s[i] -= 32;
    for (int i = 0; i < len; ++ i) {
        if (s[i] == ' ') {
            for (int j = 1; j <= n; ++ j) {
                if  (!vis[j] && sm == a[j]) {
                    vis[j] = 1;
                    ans ++; break ;
                }
            }
            sm = "";
        }
        else if (s[i] == ',') {
            for (int j = 1; j <= n; ++ j) {
                if (!vis[j] && sm == a[j]) {
                    vis[j] = 1;
                    ans ++; break ;
                }
            }
            sm = "";
        }
        else if (s[i] == '.') {
            for (int j = 1; j <= n; ++ j) {
                if (!vis[j] && sm == a[j]) {
                    vis[j] = 1;
                    ans ++; break ;
                }
            }
            sm = "";
            memset(vis, 0, sizeof vis);
        }
        else sm += s[i];//记录单词
    }
//    cout << s << endl;
    printf("%d\n", ans);
}

int main() {
    read();
    return 0;
}