#include<iostream>
#include<cstdio>
using namespace std;
#define MAX 1000001
char s[MAX],p[MAX];
int next1[MAX];
bool f;
void getnext(char p[])
{
next1[0]=0;
int j=0,k=0;
for(int i=1;i<strlen(p);i++)
{
while(k>0&&p[i]!=p[k])
k=next1[k-1];
if(p[i]==p[k])k++;
next1[i]=k;
}
}
//移动位数=已匹配的字符数-对应部分的匹配值[到i的字符串最长的 前缀==后缀的长度]
void kmp()
{
for(int i=strlen(p)-1;i>=2;i--)
{
next1[i]=i-next1[i-1];//移动的位数,下标从0开始
}
next1[0]=next1[1]=1;
int k=0;
for(int j=0;j<strlen(s);j++)
{
while(k>0&&s[j]!=p[k]){k=k+1-next1[k]-1;}//返回适当的位置
if(s[j]==p[k])k++;
if(k==strlen(p)){f=true;return;}
}
}
int main()
{
while(cin>>s>>p)
{f=false;
getnext(p);
kmp();
if(f)cout<<"true"<<endl;
else cout<<"false"<<endl;
}
return 0;
}
kmp
最新推荐文章于 2023-01-23 18:57:44 发布