[NOIP 2011 普及组] 统计单词数 · 教师题解
[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';
}