HDOJ 5763 Another Meaning

很少做这种带有综合性质的题啊,kmp+基本线性dp都写不了


先说说这个题的基本思路:首先是个字符串匹配的题,最经典的kmp算法可以在O(N)内时间解决

然后就是,如何根据kmp的匹配值进行计算,答案是dp


如果当前位置未匹配,dp【i】=dp【i-1】

如果当前位置匹配,那么dp【i】=dp【i-1】+dp【i-m】,其中m是子串的串长


套上两个模板就能AC的一个简单题


void kmp_pre(char x[],int m,int Next[]){
	int i,j,k;
	j=Next[0]=-1;
	i=0;
	while(i<m){
		while(j!=-1&&x[i]!=x[j]) j=Next[j];
		Next[++i]=++j;
	}
}

int Next[1001000];
void KMP_Count(char x[],int m,char y[],int n){
	int i,j,k;
	int ans=0;
	kmp_pre(x,m,Next);
	i=j=k=0;
	while(i<n){
		while(j!=-1&&x[j]!=y[i]) j=Next[j];
		i++;j++;k++;
		if (j>=m){
			ok[k]=true;
			//printf("%d ",k);
			j=Next[j];
		}
	}
}

int main(){
	//input;
	scanf("%d",&t);
	for(int Case=1;Case<=t;Case++){
		scanf("%s%s",y,x);
		memset(ok,false,sizeof(ok));
		memset(dp,0,sizeof(dp));
		printf("Case #%d: ",Case);
		int leny=strlen(y);
		int lenx=strlen(x);
		KMP_Count(x,lenx,y,leny);
		//for(int i=0;i<=leny;i++)
		//	if (ok[i]) printf("%d ",i);
		dp[0]=1;
		for(int i=1;i<=leny;i++)
			if (ok[i]) dp[i]=(dp[i-1]+dp[i-lenx])%mod;
			else dp[i]=dp[i-1];
		printf("%I64d\n",dp[leny]);
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值