东方博宜OJ 2391:子串位置 ← s1.find(s2,p)

【题目来源】
https://oj.czos.cn/p/2391

【题目描述】
给定一个父字符串 s 和子字符串 p,请按照从前向后的顺序,请求出 p 在 s 中所有出现的起始位置。
例如:S=ABADABCEABABA,P=ABA,则求解的结果是:1 9 11。

【输入格式】
第 1 行读入一个仅包含大写字母的字符串 s;
第 2 行读入一个仅包含大写字母的字符串 p;
s 和 p 均是长度不超过 10^6 的字符串。

【输出格式】
输出 1 行,按题意输出 p 在 s 中出现的位置,数字之间用空格隔开。

【输入样例】
ABADABCEABABA
ABA

【输出样例】
1 9 11

【数据范围】
s 和 p 均是长度不超过 10^6 的字符串。

【算法分析】
● KMP算法详见:https://blog.csdn.net/hnjzsyjyj/article/details/146059543
● 本题的KMP算法实现,详见:https://blog.csdn.net/hnjzsyjyj/article/details/160215718
● 函数 s1.find(s2, p) 的作用为从位置 p 开始查找 s2 在 s1 中的首次出现位置(从 0 开始计数)。若未找到,输出 -1。

【算法代码】

#include <bits/stdc++.h>
using namespace std;

int main() {
    string s1,s2;
    cin>>s1>>s2;

    int p=0;
    while((p=s1.find(s2,p))!=-1) {
        p++;
        cout<<p<<" ";
    }

    return 0;
}

/*
in:
ABADABCEABABA
ABA

out:
1 9 11
*/



【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/160215718
https://blog.csdn.net/hnjzsyjyj/article/details/127140892
https://blog.csdn.net/hnjzsyjyj/article/details/146059543



posted @ 2026-05-26 14:32  Triwa  阅读(9)  评论(0)    收藏  举报