1 条题解

  • 0
    @ 2026-10-18 21:32:33

    [NOIP 2011 普及组] 统计单词数

    知识点

    字符串、分词、大小写转换、线性扫描

    解题思路

    完整读入两行,将单词和文章转换为小写。按空格分出每个完整单词,比较是否与目标一致,并记录匹配次数与第一次匹配的起始下标。

    正确性说明

    题目保证文章只有字母和空格,因此扫描出的最大连续非空格段恰为独立单词。大小写统一后逐段等值比较,严格满足完整匹配;从左到右首次记录的位置即为第一次出现的位置。

    易错点

    getline保留文章前导及连续空格,不使用cin>>ws吞掉它们;下标从0开始;目标是to时不能匹配Ottoman内部的to。

    复杂度

    设文章长L、目标长W,时间O(L+W),空间O(L+W)。

    参考代码(GNU C++17)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        string word,text;getline(cin,word);getline(cin,text);
        if(!word.empty()&&word.back()=='\r')word.pop_back();
        if(!text.empty()&&text.back()=='\r')text.pop_back();
        for(char &c:word)c=tolower((unsigned char)c);for(char &c:text)c=tolower((unsigned char)c);
        int count=0,first=-1;
        for(int i=0;i<(int)text.size();){
            if(text[i]==' '){++i;continue;}int j=i;while(j<(int)text.size()&&text[j]!=' ')++j;
            if(text.compare(i,j-i,word)==0){++count;if(first==-1)first=i;}i=j;
        }
        if(count)cout<<count<<' '<<first<<'\n';else cout<<-1<<'\n';
    }
    
    • 1

    信息

    ID
    107
    时间
    1000ms
    内存
    256MiB
    难度
    进阶
    标签
    递交数
    1
    已通过
    1
    上传者