P1308 统计单词数
对应章节:一、C++ 语法基础 → (十五) STL:容器、迭代器与算法。
(一) 任务与输出目标
不区分大小写地统计完整单词,并输出第一次出现的字符下标。
(二) 建模与推导
先把目标词和文章都转成小写。文章中的单词由空格分隔,因此从左到右找每段非空格区间,整段与目标词比较。这样 to 不会误匹配到 today 中,也保留了空格占据的位置。第一次匹配时记录区间起点,后续只累加次数。
(三) 手算与过程
目标 to,文章 Today to TO:today 不计入,后两个词计入,第一次位于下标 6。
(四) 带注释实现
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve() {
string word, text;
getline(cin, word);
getline(cin, text); // 整行读入,保留文章中的空格。
for (char& c : word)
c = tolower(static_cast<unsigned char>(c));
for (char& c : text)
c = tolower(static_cast<unsigned char>(c));
int count = 0, first = -1;
for (int i = 0; i < (int)text.size();) {
if (text[i] == ' ') {
++i;
continue;
}
int start = i;
while (i < (int)text.size() && text[i] != ' ')
++i;
if (text.compare(start, i - start, word) == 0) { // 比较整个单词区间。
if (first == -1)
first = start;
++count;
}
}
if (count == 0)
cout << -1 << '\n';
else
cout << count << ' ' << first << '\n';
}
signed main() {
ios::sync_with_stdio(false); // 关闭同步,使用 cin 与 cout 完成输入输出。
cin.tie(0), cout.tie(0);
int T = 1; // 本题读入一组数据。
// cin >> T; // 题目给出测试组数时开启,并在 solve 中处理一组。
while (T--)
solve();
}(五) 复杂度
总长度为 L,时间 \(O(L)\),保存文章占 \(O(L)\)。