【模板】基础字符串算法--马拉车,烤馍片(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);
	}
}
 
posted @ 2018-05-15 18:27  Newuser233  阅读(16)  评论(0)    收藏  举报