P1321 单词覆盖还原

解题思路

这道题目需要我们统计一个字符串中出现的"boy"和"girl"单词的数量。由于这些单词可能被部分覆盖,所以不能简单地查找完整单词,而要识别出每个字符属于哪个单词。

方法思路

  1. 字符识别:遍历字符串中的每个字符,判断它属于"boy"还是"girl"单词的一部分。

  2. 独立计数

    • 对于"boy":'b'一定是一个新"boy"的开始,'o'如果前一个字符不是'b'则视为新"boy"的一部分,'y'同理。

    • 对于"girl":'g'一定是一个新"girl"的开始,后续字符'i'、'r'、'l'如果不符合连续顺序,则视为新"girl"的一部分。

  3. 输出结果:分别输出"boy"和"girl"的计数结果。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10;  // 定义数组最大长度
int vis[N];  // 未使用的标记数组
int ans1, ans2;  // ans1统计boy数量,ans2统计girl数量

int main()
{
    string s;
    cin >> s;  // 输入字符串
    for(int i = 0; i < s.size(); i++)  // 遍历字符串
    {
        // 统计boy数量
        if(s[i] == 'b') ans1++;  // 遇到b一定是新boy的开始
        else if(s[i] == 'o' && s[i - 1] != 'b') ans1++;  // o前不是b则视为新boy
        else if(s[i] == 'y' && s[i - 1] != 'o') ans1++;  // y前不是o则视为新boy
        
        // 统计girl数量
        if(s[i] == 'g') ans2++;  // 遇到g一定是新girl的开始
        else if(s[i] == 'i' && s[i - 1] != 'g') ans2++;  // i前不是g则视为新girl
        else if(s[i] == 'r' && s[i - 1] != 'i') ans2++;  // r前不是i则视为新girl
        else if(s[i] == 'l' && s[i - 1] != 'r') ans2++;  // l前不是r则视为新girl
    }
    
    cout << ans1 << endl << ans2 << endl;  // 输出结果
    return 0;
}

代码解释

  • 输入处理:读取输入的字符串。

  • 遍历字符串:逐个字符检查是否属于"boy"或"girl"的一部分。

  • boy计数

    • 'b'字符总是表示一个新"boy"的开始。

    • 'o'字符如果前面不是'b',则表示一个新"boy"的一部分。

    • 'y'字符如果前面不是'o',同样表示一个新"boy"的一部分。

  • girl计数

    • 'g'字符总是表示一个新"girl"的开始。

    • 'i'、'r'、'l'字符如果前面不是预期的前一个字符,则表示一个新"girl"的一部分。

  • 输出结果:分别输出"boy"和"girl"的计数结果。

这种方法有效地处理了单词被部分覆盖的情况,确保每个字符都被正确归类统计。时间复杂度为O(n),其中n是字符串长度,适用于题目给定的数据范围。

posted @ 2025-05-01 15:34  CRt0729  阅读(85)  评论(0)    收藏  举报