描述


求一个字符串在另一个字符串中的位置,称为模式匹配,如果匹配成功,则输出第一次匹配成功的位置,否则输出0。KMP算法是一种高效的模式匹配算法。要求采用KMP算法完成该题目。


输入


输入包今含若干个测试用例,每个测试用例占两行,其中第一行为目标字符串,第二行为模式串。


输出


对每个测试用例,用两行输出,其中第一行输出该用例的模式串的各字符的next值,第二行输出模式串在目标串中第一次匹配成功的位置。如果匹配不成功,则输出0。


样例输入


abcdefg
bcd
0000001
0001
110011001100
111
dabcabcabc
abc



样例输出


0 1 1
2
0 1 2 3
4
0 1 2
0
0 1 1
2



#include<iostream>
#include<cstring>
using namespace std;
string s1,s2;
int next[50]={0};
void Next(string s2)
{
int k=3,j,i;
next[1]=0; next[2]=1;
while(k<=s2.size()){
j=k-1; i=next[j];
while(j-1&&s2[j-1]!=s2[i-1]){
j=i;
i=next[j];
}
next[k]=i+1;
k++;
}
}
int Index_KMP(string s1,string s2)
{
int i=1,j=1;
while(i<=s1.size()&&j<=s2.size()){
if(s1[i-1]==s2[j-1]||j==0){i++;j++;}
else j=next[j];
}
if(j>s2.size())return i-j+1;
return 0;
}
int main()
{
int i;
while(cin>>s1>>s2)
{
i=1;
Next(s2);
while(i<s2.size())
{
cout<<next[i++]<<" ";
}
cout<<next[i]<<endl;
cout<<Index_KMP(s1,s2)<<endl;
}
return 0;
}