poj3461/*输出所有出现的位置、出现次数 */
#include<iostream>
#include<cstring>
using namespace std;
string s,t;
int ans;
int next[
100000];
int slen,tlen;
int main()
{
cin>>s>>
t;
slen=s.length(),tlen=
t.length();
int j,k;j=
0,k=-
1;
next[0]=-
1;
while(j<
tlen)
{
if(k==-
1||t[j]==
t[k])
{
k++,j++
;
next[j]=
k;
}
else k=
next[k];
}
int i;
j=
0,i=
0;
while(i<
slen)
{
if(j==-
1||s[i]==t[j])i++,j++
;
else j=
next[j];
if(j==
tlen)
{
cout<<i-tlen<<
' ';
ans++
;
}
}
cout<<endl<<
ans;
return 0;
}
/*另一种,在别人的代码中看见的,然而并不能看懂。。。难以理解,不举荐*/
#include <iostream>
#include <cstring>
using namespace std;
const int N =
1000002;
int next[N];
char S[N], T[N];
int slen, tlen;
void getNext()
{
int j, k;
j =
0; k = -
1; next[
0] = -
1;
while(j <
tlen)
if(k == -
1 || T[j] ==
T[k])
next[++j] = ++
k;
else
k =
next[k];
}
/*
返回模式串T在主串S中首次出现的位置
返回的位置是从0开始的。
*/
int KMP_Index()
{
int i =
0, j =
0;
getNext();
while(i < slen && j <
tlen)
{
if(j == -
1 || S[i] ==
T[j])
{
i++; j++
;
}
else
j =
next[j];
}
if(j ==
tlen)
return i -
tlen;
else
return -
1;
}
/*
返回模式串在主串S中出现的次数
*/
int KMP_Count()
{
int ans =
0;
int i, j =
0;
if(slen ==
1 && tlen ==
1)
{
if(S[
0] == T[
0])
return 1;
else
return 0;
}
getNext();
for(i =
0; i < slen; i++
)
{
while(j >
0 && S[i] !=
T[j])
j =
next[j];
if(S[i] ==
T[j])
j++
;
if(j ==
tlen)
{
ans++
;
j =
next[j];
}
}
return ans;
}
int main()
{
int TT;
int i, cc;
cin>>
TT;
while(TT--
)
{
cin>>T>>
S;
slen =
strlen(S);
tlen =
strlen(T);
cout<<
"模式串T在主串S中首次出现的位置是: "<<KMP_Index()<<
endl;
cout<<
"模式串T在主串S中出现的次数为: "<<KMP_Count()<<
endl;
}
return 0;
}
洛谷 kmp字符串匹配
/*lrh*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int next[
100010];
char p[
10010],s[
1000010];
int t,num,l1,l2;
void get_next()
{
int j=
0;
int k=-
1;
next[0]=-
1;
while(j<
l2)
{
if(k==-
1||p[k]==
p[j])
{
k++
;
j++
;
next[j]=
k;
}
else
{
k=
next[k];
}
}
}
int kmp()
{
int i=
0;
int j=
0;
get_next();
while(i<
l1)
{
if(j==-
1||p[j]==
s[i])
{
j++
;
i++
;
}
else
{
j=
next[j];
}
if(j==
l2)
{
cout<<i-l2+
1<<
endl;
j=
next[j];
}
}
}
int main()
{
t=
1;
while(t--
)
{
num=
0;
cin>>s>>
p;
l1=
strlen(s);
l2=
strlen(p);
get_next();
kmp();
for(
int i=
1;i<=l2;i++)cout<<next[i]<<
' ';
}
}
/*myl*/
#include<iostream>
#include<cstring>
using namespace std;
string s,t;
//int ans;
int next[
100000];
int slen,tlen;
int main()
{
cin>>s>>
t;
slen=s.length(),tlen=
t.length();
int j,k;j=
0,k=-
1;
next[0]=-
1;
while(j<
tlen)
{
if(k==-
1||t[j]==
t[k])
{
k++,j++
;
next[j]=
k;
}
else k=
next[k];
}
int i;
j=
0,i=
0;
while(i<
slen)
{
if(j==-
1||s[i]==t[j])i++,j++
;
else j=
next[j];
if(j==
tlen)
{
cout<<i-tlen+
1<<
endl;
j=
next[j];
//ans++;
}
}
for(
int i=
1;i<=tlen;i++
)
cout<<next[i]<<
' ';
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-672244.html