热门

最新

红包

立Flag

投票

同城

我的

发布
gersdd
gersdd
4 年前
truegersdd


大佬们能不能解释下这个代码主要用来干嘛!!!







#include<bits/stdc++.h>
using namespace std;
int len(char *s)
{
int i=0;
while(s[i++]!='\0'){}
return i-1;
}
void GenKMPNext(int next[],char *s)
{
int n=len(s);
next[0]=-1;
next[1]=0;
int i;
for(i=2;i<n;i++)
{
int k=0;
int max=0;
while(++k<i)
{
bool flag=true;
for(int j=0;j<k;j++)
{
if(s[j]==s[i-k+j])continue;
else
{
flag=false;
break;
}
}
if(flag)
{
max=k;
}
}
next[i]=max;
}
for(int i=2;i<n;i++)
{
if(s[next[i]]==s[i])next[i]=next[next[i]];
}
}
int Find(char* s,char * p)
{
int n=len(p);
int next[n];
GenKMPNext(next,p);
int i,j;
for(i=0, j=0;i<n && j<len(s);)
{
if(p[i]==s[j]){
i++,j++;
}
else if(next[i]>=0)i=next[i];
else {
i=0;j++;
}
}
if(i>=n)
{
return j-n;
}
else return -1;
}
int main()
{
char s[100];
cin>>s;
char p[10];
cin>>p;
cout<<Find(s,p)<<endl;
// int next[100];
// GenKMPNext(next,s);
// for(int i=0;iclen(s);i++)
// {
// cout<<next[i]<<endl;
// }
}

CSDN App 扫码分享
分享
评论
点赞
打赏
  • 复制链接
  • 举报
下一条:
继续努力学习
立即登录