CSP歷年複賽題-P1308 [NOIP2011 普及組] 統計單詞數

江城伍月發表於2024-05-29

原題連結: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;
}

相關文章