P1113 string查找单词位置

暂无评定 传统题 GESP字符串STL语法基础字符串入门 上传者
时间限制1000ms
内存限制256MiB
通过 / 提交0/0

P1113string查找单词位置

暂无评定 传统题 GESP字符串STL语法基础字符串入门 上传者
时间限制1000ms
内存限制256MiB
通过 / 提交0/0

题目描述

小A有一个字符串(可能包含字母、数字,但没有空格)。
现在要对它进行 n n 次查找操作,每次操作有两种类型:

  • op == 1:输入一个字符串 x x ,从左往右查找 x x 第一次出现的位置(即最左边出现的位置)。
    如果找到,输出该子串第一个字符在原始字符串中的位置(位置从 1 开始计数);
    如果找不到,输出 "error!"(带感叹号)。

  • op == 2:输入一个字符串 x x ,从右往左查找 x x 第一次出现的位置(即最右边出现的位置)。
    如果找到,输出该子串第一个字符在原始字符串中的位置(位置从 1 开始计数);
    如果找不到,输出 "error!"(带感叹号)。

注意:查找时区分大小写(例如 "Ab" 和 "ab" 不同)。

输入格式

第一行:一个字符串 s s ,表示初始字符串(不含空格)。
第二行:一个整数 n n ,表示操作次数。
接下来 n n 行,每行描述一个操作:

  • 如果操作类型为 1:1 x
  • 如果操作类型为 2:2 x

其中 x 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)→ 输出 1
  • 2 ab:从右往左第一次出现(即最右边) "ab" 起始位置为 5(字符 5~6)→ 输出 5
  • 1 ba:从左往右第一次出现 "ba" 起始位置为 2(字符 2~3)→ 输出 2
  • 1 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 开始 → 1
  • 2 Cpp:"Cpp" 从位置 6 开始(H e l l o C p p,C在位置6) → 6
  • 1 oC:"oC" 从位置 5 开始("oC" 是 o 和 C) → 5
  • 2 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! 时必须带感叹号,且为英文半角字符。

数据规模

  • 初始字符串长度 1≤∣s∣≤1000 1 \le |s| \le 1000
  • 操作次数 1≤n≤100 1 \le n \le 100
  • 每个查询字符串 x x 的长度 1≤∣x∣≤100 1 \le |x| \le 100
  • 所有字符串只包含大小写字母和数字(没有空格、标点等)