【模板】基础字符串算法--马拉车,烤馍片(KMP),最小表示法
一些很基础的的字符串算法模板(不予解释)
烤馍片(KMP)
void kmp()//烤馍片
{
fail[1]=j=0;
for(int i=2;i<=m;i++)
{
while(j>0&&b[i]!=b[j+1]) j=fail[j];
if(b[i]==b[j+1]) j++;
fail[i]=j;
}
j=0;
for(int i=1;i<=n;i++)
{
while(j>0&&a[i]!=b[j+1]) j=fail[j];
if(a[i]==b[j+1]) j++;
if(j==m)
{
printf("%d ",i-j+1);
j=fail[j];
}
}
}
最小表示法(MinShow)
void MinShow//最小表示法
{
int i=0; int j=1;
cin>>s; L=s.size();
s=s+s; int k;
while(i<L&&j<L)
{
for(k=0;k<L;k++) if(s[i+k]!=s[j+k]) break;
if(k==L) break;
if(s[i+k]>s[j+k]) i=i+k+1;
else j=j+k+1;
if(i==j) j++;
}
printf("%d",min(i,j));
}
马拉车(manacher)
void manacher()//马拉车
{
int mx=0,p=0; int ans=0;
for(int i=1;i<len;i++)
{
if(i<mx) r = min(mx-i+1,r[p*2-i]);
else r=1;
while(a[i+r[i]]==a[i-r[i]]) r[i]++;
if(i+r[i]-1>mx)
{
mx=i+r[i]-1;
p=i;
}
ans=max(ans,r[i]-1);
}
}

浙公网安备 33010602011771号