东方博宜OJ 2391:子串位置 ← s1.find(s2,p)
【题目来源】https://oj.czos.cn/p/2391【题目描述】给定一个父字符串 s 和子字符串 p请按照从前向后的顺序请求出 p 在 s 中所有出现的起始位置。例如SABADABCEABABAPABA则求解的结果是1 9 11。【输入格式】第 1 行读入一个仅包含大写字母的字符串 s第 2 行读入一个仅包含大写字母的字符串 ps 和 p 均是长度不超过 10^6 的字符串。【输出格式】输出 1 行按题意输出 p 在 s 中出现的位置数字之间用空格隔开。【输入样例】ABADABCEABABAABA【输出样例】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; cins1s2; int p0; while((ps1.find(s2,p))!-1) { p; coutp ; } return 0; } /* in: ABADABCEABABA ABA out: 1 9 11 */【参考文献】https://blog.csdn.net/hnjzsyjyj/article/details/160215718https://blog.csdn.net/hnjzsyjyj/article/details/127140892https://blog.csdn.net/hnjzsyjyj/article/details/146059543