CSP历年复赛题-P1308 [NOIP2011 普及组] 统计单词数

原题链接:https://www.luogu.com.cn/problem/P1308

题意解读:给定单词a,文本b,在b中找a的个数,并找a第一次出现的位置,注意b中任何位置可能含有多个连续空格。

解题思路:

通过双指针找b中每一个单词的首、尾位置i,j,与a进行一一比较即可。

注意1:比较时不考虑大小写,可以统一转成小写字符tolower()

注意2:如果写比较函数,不要把文本b作为参数传递,否则会超时,除非加引用string &b

注意3:输入要用getline(cin, str)

100分代码:

#include <bits/stdc++.h>
using namespace std;

string a, b;
int cnt = 0, first = -1, pos = 0;

//判断a与b[l]~b[r-1]是否相等
bool cmp(int l, int r)
{
    if(a.size() != r - l) return false;
    for(int i = 0; i < a.size(); i++)
    {
        if(tolower(a[i]) != tolower(b[l + i]))
            return false;
    }
    return true;
}

int main()
{
    getline(cin, a);
    getline(cin, b);
    
    for(int i = 0; i < b.size(); i++)
    {
        if(b[i] != ' ') //找到一个单词的首字符
        {
            int j = i;
            while(b[j] != ' ' && j < b.size()) j++; //找到一个单词的末尾+1的位置
            if(cmp(i, j))
            {
                cnt++;
                if(first == -1) first = i;
            }

            i = j;
        }
    }
    
    if(cnt > 0) cout << cnt << " " << first;
    else cout << -1;

    return 0;
}

 

posted @ 2024-05-29 13:51  五月江城  阅读(54)  评论(0编辑  收藏  举报