首页 > 其他分享 >CF613E Puzzle Lover 思考--zhengjun

CF613E Puzzle Lover 思考--zhengjun

时间:2023-07-28 20:33:15浏览次数:44  
标签:pw -- Puzzle 1ll len zhengjun int dp mod

题很简单,一遍写对却比较困难。

犯的错误:

  • 预处理 \({base}^i\) 时应该要处理到 \(\max\{n,m\}\);

  • 去重的时候(reduce 函数)特判 \(m=1,2\)。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=2e3+10,mod=1e9+7,base=23333;
int n,m;
char a[2][N],b[N];
int pw[N],f[2][N],g[2][N],pre[N],suf[N];
int Hash1(int t,int l,int r){
	return (f[t][r]+1ll*(mod-pw[r-l+1])*f[t][l-1])%mod;
}
int Hash2(int t,int l,int r){
	return (g[t][l]+1ll*(mod-pw[r-l+1])*g[t][r+1])%mod;
}
int merge(int x,int y,int len){
	return (1ll*x*pw[len]+y)%mod;
}
int ans,dp[N][N][2];
void solve(){
	memset(dp,0,sizeof dp);
	for(int i=1;i<=m;i++){
		pre[i]=(1ll*pre[i-1]*base+b[i])%mod;
	}
	for(int i=m;i>=1;i--){
		suf[i]=(suf[i+1]+1ll*pw[m-i]*b[i])%mod;
	}
	for(int i=0;i<=n;i++)dp[i][0][0]=dp[i][0][1]=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			for(int t=0;t<2;t++){
				if(b[j]!=a[t][i])continue;
				(dp[i][j][t]+=dp[i-1][j-1][t])%=mod;
				if(j>1&&b[j-1]==a[!t][i])(dp[i][j][t]+=dp[i-1][j-2][!t])%=mod;
			}
		}
		for(int t=0;t<2;t++){
			for(int len=2;len<=i;len++){
				int l=i-len+1,r=i,j=len*2;
				if(len*2>m)continue;
				if(merge(Hash2(!t,l,r),Hash1(t,l,r),len)==pre[j])
					++dp[i][j][t]%=mod;
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int t=0;t<2;t++){
			(ans+=dp[i][m][t])%=mod;
			for(int len=2;len<=n-i+1;len++){
				int l=i,r=i+len-1;
				if(len*2>m)continue;
				if(merge(Hash1(t,l,r),Hash2(!t,l,r),len)==suf[m-len*2+1])
					(ans+=dp[i-1][m-len*2][t])%=mod;
			}
		}
	}
}
void reduce(){
	if(m>1){
		if(m&1)return;
		for(int i=1;i<=n;i++){
			for(int t=0;t<2;t++){
				int len=m/2,l=i,r=i+len-1;
				if(r>n)continue;
				if(merge(Hash1(t,l,r),Hash2(!t,l,r),len)==pre[m])ans--;
			}
		}
		if(m==2)return;
		for(int i=1;i<=n;i++){
			for(int t=0;t<2;t++){
				int len=m/2,l=i-len+1,r=i;
				if(l<1)continue;
				if(merge(Hash2(!t,l,r),Hash1(t,l,r),len)==pre[m])ans--;
			}
		}
	}else{
		for(int i=1;i<=n;i++){
			for(int t=0;t<2;t++){
				ans-=b[m]==a[t][i];
			}
		}
	}
	(ans+=mod)%=mod;
}
int main(){
	freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	scanf("%s%s%s",a[0]+1,a[1]+1,b+1);
	n=strlen(a[0]+1),m=strlen(b+1);
	for(int i=pw[0]=1;i<=max(n,m);i++)pw[i]=1ll*pw[i-1]*base%mod;
	for(int t=0;t<2;t++){
		for(int i=1;i<=n;i++){
			f[t][i]=(1ll*f[t][i-1]*base+a[t][i])%mod;
		}
		for(int i=n;i>=1;i--){
			g[t][i]=(1ll*g[t][i+1]*base+a[t][i])%mod;
		}
	}
	solve();
	reverse(b+1,b+1+m);
	solve();
	reduce();
	cout<<ans;
	return 0;
}

标签:pw,--,Puzzle,1ll,len,zhengjun,int,dp,mod
From: https://www.cnblogs.com/A-zjzj/p/17588842.html

相关文章

  • 【手撕 Spring】一键开启 Spring 入门之路
    ......
  • “我确实还没准备好秋招”
    本文首发自公粽hao「林行学长」,欢迎来撩,免费领取20个求职工具资源包。了解校招、分享校招知识的学长来了!不知不觉中,24届秋招开了一段时间。牛客上已经有提前批面经、提前批Offer的帖了。而大规模秋招在8月也即将上演。肯定有朋友想着:“最后一个暑假了,开学再去想秋招的事吧!”学......
  • 【建议收藏】 11个适合程序员逛的在线社区
    网上的社区氛围浓厚、分享全面,非常有助于技术的提升。今天,就和大家分享几个自己经常逛的技术类社区和论坛:1.gitHub网站地址:https://github.com/网站简介:gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git作为唯一的版本库格式进行托管,故名gitHub。gitHub上面有很多资源,很......
  • 布客·ApacheCN 翻译校对活动进度公告 2020.5
    注意请贡献者查看参与方式,然后直接在ISSUE中认领。翻译/校对三个文档就可以申请当负责人,我们会把你拉进合伙人群。翻译/校对五个文档的贡献者,可以申请实习证明。请私聊片刻(529815144)、咸鱼(1034616238)、或飞龙(562826179)来领取以上奖励。可解释的机器学习【校对】参与方式:https://g......
  • CDNDrive 第一个版本发布 & 布客新知第二次备份完成
    CDNDrive第一个版本发布,新适配五个图床https://github.com/apachecn/CDNDrive另外,布客新知第二次备份完成TutorialsPoint:http://it-ebooks.flygon.net/tutorialspoint-cdndrive/计算机电子书2019:http://it-ebooks.flygon.net/it-ebooks-2019-cdndrive/知识星球:http://it-ebooks.f......
  • PyTorch 1.4 中文文档校对活动正式启动 | ApacheCN
    一如既往,PyTorch1.4中文文档校对活动启动了!认领须知请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并不要求您做到十全十美,因此请不要担心因为翻译上犯错——在大部分情况下,我们的服务器已经记录所有的翻译,因此您不必担心会因为您的失误遭到无法挽回的破坏。(改编自维基百......
  • ApacheCN 活动汇总 2019.8.16
    公告欢迎大家在我们平台上投放广告。如果你希望在我们的专栏、文档或邮件中投放广告,请准备好各种尺寸的图片和专属链接,我们组织了一个开源互助平台,方便开源组织和大V互相认识,互相帮助,整合资源。请回复这个帖子并注明组织/个人信息来申请加入。请回复这个帖子来推荐希望翻译的内容......
  • 小凯的疑惑
    题目小凯的疑惑题面[NOIP2017提高组]小凯的疑惑/[蓝桥杯2013省]买不到的数目题目背景NOIP2017提高组D1T1题目描述小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。......
  • 「赛后总结」暑假集训:20230727 CSP 模拟赛
    「赛后总结」20230727CSP模拟赛点击查看目录目录「赛后总结」20230727CSP模拟赛总结题解T1卷T2简单题T3粉丝T4字符串已经入园两年了吗。好快哦。2023年7月28日20:04:早上就写完了但忘了发了。以下内容均写于「2023年7月27日」。前两天题还没改完呢,有......
  • Educational Codeforces Round 152 (Rated for Div. 2)记录
    A.MorningSandwich#include<cstdio>#include<algorithm>#include<cmath>#include<vector>#include<string.h>#include<set>#include<string>#include<map>#include<iostream>#include<queue......