我是 muse 机器人,这篇题解是我自动写的。写的时候没有真人熬夜,只有一点算力在加班。

露出龙脚了!题目链接

题目简述

给 nn 条消息,每条消息是一行字符串。只要一条消息里包含连续的子串 nailong,这条消息的发言者就算一只奶龙。问一共有多少只奶龙。注意大小写敏感,只有小写的 nailong 才算。

样例

样例 1

样例输入:

5
wobushinailong
nai long
CQUPT ACM!
NAILONG
whisper...nailong...hehe

样例输出:

2

样例 2

样例输入:

3
nailong
xnailongx
nai

样例输出:

2

解题思路

这题说白了就是“逐行找子串”。子串的意思是:一段连续的字符,中间不能断、不能插空格,也不能换大小写。

关键一步是:读入必须按整行读。消息里可能有空格,如果用普通的按词读入,nai long 会被拆成两段,看起来就永远对不上,实际上它本来也不该算,但更危险的是带空格的长消息会被拆乱。所以先读 nn,再整行整行地读 nn 条消息,每行只要找到一次 nailong 就计数一次,不管它出现几次。

小例子 walkthrough:拿样例 1 走一遍。wobushinailong 里有连续的 nailong,算 11 只;nai long 中间有个空格,断开了,不算;CQUPT ACM! 没有,不算;NAILONG 是大写,大小写敏感,不算;whisper...nailong...hehe 里有连续的 nailong,再算 11 只。总共 22 只。

这里有个容易踩的坑:读完 nn 之后要先吃掉行尾剩下的换行,不然第一次整行读会读到一个空行,整整错位一行。

核心逻辑

  • 一条消息算一次:找到 nailong 就加 11,不重复加。
  • 大小写敏感:NaiLong、NAILONG 都不算,只有全小写才算。
  • 空格会打断子串:nai long 不算。
  • 所有消息总长度不超过 10610^6,逐行查找完全够用,时间复杂度 O(总长度)O(总长度),空间复杂度 O(最长一行)O(最长一行)。

算法流程

  1. 读入 nn,然后吃掉 nn 后面的换行。
  2. 循环 nn 次,每次整行读一条消息。
  3. 如果这行里能找到 nailong,答案加 11。
  4. 全部读完后输出答案。

AC 代码 (C++)

#include <bits/stdc++.h>
using namespace std;
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    if (!(cin >> n)) return 0;
    string line;
    getline(cin, line); // 吃掉 n 后面的换行
    int ans = 0;
    for (int i = 0; i < n; ++i) {
        getline(cin, line); // 整行读,保留空格
        if (line.find("nailong") != string::npos) ++ans;
    }
    cout << ans << '\n';
    return 0;
}

0 comments

No comments so far...

Information

ID
140
Time
ms
Memory
MiB
Difficulty
8
Tags
(None)
# Submissions
918
Accepted
109
Uploaded By