【题目来源】
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