作者:mobiledu2502858393 | 来源:互联网 | 2023-10-09 19:56
题目描述:
给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置。
为了减少骗分的情况,接下来还要输出子串的前缀数组next。
(如果你不知道这是什么意思也不要问,去百度搜[kmp算法]学习一下就知道了。)
输入输出格式
输入格式:
第一行为一个字符串,即为s1(仅包含大写字母)
第二行为一个字符串,即为s2(仅包含大写字母)
输出格式:
若干行,每行包含一个整数,表示s2在s1中出现的位置
接下来1行,包括length(s2)个整数,表示前缀数组next[i]的值。
输入输出样例
输入样例#1:
ABABABC
ABA
输出样例#1:
1
3
0 0 1
说明
时空限制:1000ms,128M
数据规模:
设s1长度为N,s2长度为M
对于30%的数据&#xff1a;N<&#61;15&#xff0c;M<&#61;5
对于70%的数据&#xff1a;N<&#61;10000&#xff0c;M<&#61;100
对于100%的数据&#xff1a;N<&#61;1000000&#xff0c;M<&#61;1000
样例说明&#xff1a;
题解&#xff1a;就是kmp算法,模板题&#xff0c;但是千万注意&#xff0c;在洛谷数组名字不可能用next&#xff0c;会编译错误&#xff0c;非常得迷幻。
#include
#include
#include
using namespace std;
int NEXT[10100000],la,lb;
char a[10000100],b[10000100];
void gnext()
{int t&#61;0;NEXT[1]&#61;0;for(int i&#61;2;i<&#61;lb;i&#43;&#43;){while(b[t&#43;1]!&#61;b[i]&&t>0)t&#61;NEXT[t];if(b[t&#43;1]&#61;&#61;b[i]) t&#43;&#43;;NEXT[i]&#61;t;}
}
void kmp()
{int i&#61;1,j&#61;0;while(i<&#61;la){while(j>0&&b[j&#43;1]!&#61;a[i])j&#61;NEXT[j];if(b[j&#43;1]&#61;&#61;a[i]){j&#43;&#43;;if(j&#61;&#61;lb){printf("%d\n",i-lb&#43;1);} }i&#43;&#43;;}}
int main()
{scanf("%s%s",a&#43;1,b&#43;1);la&#61;strlen(a&#43;1);lb&#61;strlen(b&#43;1);gnext();kmp();for(int i&#61;1;i<&#61;lb;i&#43;&#43;){printf("%d ",NEXT[i]);}return 0;
}
此文谨记我搞了一整个星期天被洛谷迷之编译错误搞死的kmp算法&#xff01;&#xff01;&#xff01;&#xff01;