题目来源:
https://ac.nowcoder.com/acm/contest/27589/A
参考博客:
#include<bits/stdc++.h>//题目大意两个字符串中寻找字串,并求第二个字符串中的前缀最大长度
using namespace std;
int b[1000005];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
string s1,s2;
cin>>s1>>s2;//输入两个字符串
int len1 = s1.size(), len2 = s2.size();//用一个size取字符串长度,减少时间复杂度
//取next数组,这里用b数组表示,原因是在c++的万能头中有next的数据流
int j=0;
int k=-1;//负一版本
b[0]=-1;
while(j<len2)
{
if(k==-1||s2[j]==s2[k])//对其拼接满足条件就依此后移
{
j++;
k++;
b[j]=k;
}
else
{
k=b[k];//当字串中出现不匹配的字符时,回退到当前最大前缀处
}
}
//求字串在原字符串中的位置,道理同上
j=0;
k=0;
while(j<len1)
{
if(k==-1||s1[j]==s2[k])
{
j++;
k++;
}
else
{
k=b[k];
}
if(k==len2)
{
cout << j - k + 1 << '\n';
}
}
for(int i=1;i<=len2;i++)
{
cout<<b[i]<<" ";
}
cout<<endl;
return 0;
}