暑假来临,一大堆新知识接踵而至。。。。。。
manachar(这么短,背一背好了)
void prepare()
{
for(int i=1;i<=n;i++)
{
s[i*2-1]='#';
s[i*2]=a[i];
s[i*2+1]='#';
}
n=n*2+1;
}
void manachar()
{
maxlen=0;
id=0;
for(int i=1;i<=n;i++)
{
if(maxlen>i) p[i]=min(p[id*2-i],maxlen-i); else p[i]=1;
while(i+p[i]<=n&&i-p[i]>=1&&s[i+p[i]]==s[i-p[i]]) p[i]++;
if(p[i]+i>maxlen)
{
maxlen=p[i]+i;
id=i;
}
}
ans=0;
for(int i=1;i<=n;i++) ans=max(ans,p[i]-1);
cout<<ans<<endl;
}
KMP
int main()
{
scanf("%s",a+1);
scanf("%s",b+1);
n=strlen(a+1); //example string
m=strlen(b+1); //search string
int k=0;
Next[1]=0;
for(int i=2;i<=n;i++)
{
while(k>0&&a[i]!=a[k+1]) k=Next[k];
if(a[i]==a[k+1]) k++;
Next[i]=k;
}
k=0;ans=0;
for(int i=1;i<=m;i++)
{
while(k>0&&b[i]!=a[k+1]) k=Next[k];
if(b[i]==a[k+1]) k++;
if(k==n) ans++;
}
cout<<ans<<endl;
return 0;
}
本文介绍了Manacher算法和KMP算法的实现细节,Manacher算法用于寻找字符串中最长回文子串,KMP算法则用于解决字符串匹配问题。通过具体的C++代码示例,读者可以了解到这两种算法的工作原理及其实现过程。
5万+

被折叠的 条评论
为什么被折叠?



