1 条题解
-
0
[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