题目描述
小明是一野生动物园的管理人员,他统计了一份野生动物的名单,糟糕的是,因为操作不当导致打乱了名单,每种野生动物出现的次数都无法进行查询。
小明只能重新进行统计,已知名单中的动物名称只由大小写字母构成,不存在其他字符,屋漏偏逢连夜雨,小明的健盘输入也出现了问题,输入的动物名称可能与名单中的名称大小写不一致,所以只有当输入的名称与名单中的名称在都小写的情况下字母完全相同并且不是某个动物名称的一部分才说明是同一种野生动物,小明想要知道K种野生动物在名单当中的所有位置以及出现次数。
输入描述
第一行为一个字符串,只包含大小写以及空格,表示动物名单。
第二行为一个整数K,表示需要统计K种野生动物。
接下来K行,每行为一个字符串,只包含大小写字母,表示野生动物名称。
输出描述
输出若干行,如果出现过则输出2行,第一行若干个数字表示野生动物在名单当中的所有位置(只输出动物名称首字母在名单中的位置),第二行一个数字表示该野生动物出现的次数,如果没有出现过,则输出-1。
考察点
string字符串
=输入
===geline()输入
===正常输入
=运用
===字符串取长度
===字符串拼接
===字符串转小写
===字符串查找
参考答案
#include <iostream> #include <string> using namespace std;int main() {// 输入动物名单string animals;getline(cin, animals);int len_animals = animals.length(); // 获取名单长度for (int i = 0; i < len_animals; i++){animals[i] = tolower(animals[i]); // 全部转小写}animals = ' ' + animals + ' '; // 为了保证不是查询的动物不是某个动物的一部分,头尾加空格// 输入统计动物数量int k;cin >> k;// 统计动物string find;for (int i = 1; i <= k; i++){cin >> find;int len_find = find.length(); // 获取查询动物的长度for (int i = 0; i < len_find; i++){find[i] = tolower(find[i]); // 全部转小写}find = ' ' + find + ' '; // 为了保证不是查询的动物不是某个动物的一部分,头尾加空格// 开始统计int pos = animals.find(find);if (pos == string::npos) // 找不到查询动物{cout << -1 << endl;continue;}int cnt = 0; // 统计的计数器while (pos != string::npos) // 还有出现的想要查询的动物{cout << pos << ' ';pos = animals.find(find, pos+1);cnt++;}cout << cnt;}return 0; }
运行效果