题目描述
小A有一个字符串(可能包含字母、数字,但没有空格)。
现在要对它进行 次查找操作,每次操作有两种类型:
-
op == 1:输入一个字符串 ,从左往右查找 第一次出现的位置(即最左边出现的位置)。
如果找到,输出该子串第一个字符在原始字符串中的位置(位置从 1 开始计数);
如果找不到,输出"error!"(带感叹号)。 -
op == 2:输入一个字符串 ,从右往左查找 第一次出现的位置(即最右边出现的位置)。
如果找到,输出该子串第一个字符在原始字符串中的位置(位置从 1 开始计数);
如果找不到,输出"error!"(带感叹号)。
注意:查找时区分大小写(例如 "Ab" 和 "ab" 不同)。
输入格式
第一行:一个字符串 ,表示初始字符串(不含空格)。
第二行:一个整数 ,表示操作次数。
接下来 行,每行描述一个操作:
- 如果操作类型为 1:
1 x - 如果操作类型为 2:
2 x
其中 是要查找的字符串,也不含空格。
输出格式
对于每一个操作,输出一行结果:找到时输出一个整数(位置从 1 开始),找不到时输出 "error!"。
输入输出样例
样例输入 #1
ababab
5
1 ab
2 ab
1 ba
1 abc
2 ba
样例输出 #1
1
5
2
error!
4
样例解释 #1
初始字符串 "ababab"(长度 6,字符位置 1~6 依次为 a,b,a,b,a,b)
1 ab:从左往右第一次出现"ab"起始位置为 1(字符 1~2)→ 输出 12 ab:从右往左第一次出现(即最右边)"ab"起始位置为 5(字符 5~6)→ 输出 51 ba:从左往右第一次出现"ba"起始位置为 2(字符 2~3)→ 输出 21 abc:找不到 → 输出error!2 ba:从右往左第一次出现"ba"起始位置为 4(字符 4~5)→ 输出 4
样例输入 #2
HelloCpp
4
1 Hel
2 Cpp
1 oC
2 zzz
样例输出 #2
1
6
4
error!
样例解释 #2
1 Hel:"Hel"从位置 1 开始 → 12 Cpp:"Cpp"从位置 6 开始(H e l l o C p p,C在位置6) → 61 oC:"oC"从位置 5 开始("oC"是 o 和 C) → 52 zzz:找不到 →error!
说明/提示
如何使用 C++ 的 find 和 rfind
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "ababab";
string x = "ab";
// 从左往右查找,返回下标(从 0 开始)
size_t pos = s.find(x);
if (pos != string::npos) {
// 位置从 1 开始,所以输出 pos + 1
cout << pos + 1 << endl;
} else {
cout << "error!" << endl;
}
// 从右往左查找
pos = s.rfind(x);
if (pos != string::npos) {
cout << pos + 1 << endl;
} else {
cout << "error!" << endl;
}
return 0;
}
重要说明:
find和rfind返回的是size_t类型(无符号整数),下标从 0 开始。
题目要求输出从 1 开始的位置,所以需要+1。- 如果没有找到,函数返回
string::npos(通常是一个很大的数)。
判断时使用if (pos == string::npos)表示找不到。 - 两个函数都区分大小写,
"abc"和"Abc"视为不同。
注意事项
- 输入的字符串和查询串都不含空格,可以直接使用
cin >> s和cin >> x。 - 每个操作独立查找,不影响原始字符串的内容。
- 输出
error!时必须带感叹号,且为英文半角字符。
数据规模
- 初始字符串长度
- 操作次数
- 每个查询字符串 的长度
- 所有字符串只包含大小写字母和数字(没有空格、标点等)