CF613E 题解

CF865E 题解 CF865E 首先考虑差的性质,也就是 S=∑iai−biS = \sum_{i} a_i - b_iS=∑i​ai​−bi​ 我们会发现如果没有进位这个值就是 000,不然如果有进位那么每一位会多出来 151515 的贡献,可以发现合法的情况是 S≡0(mod15)S \equiv 0 \pmod {15}S≡0(mod15)。 不然就是不合法的。 然后我们需要钦定有多少位是进位的,复杂度是 (136)\binom{13}{6}(613​) 可以接受的样子。 又因为 bbb 是 aaa 的置换,本质上 阅读详情

题意:给出一个2×n2\times n2×n的矩阵AAA,每个元素均为小写字母。再给出一个字符串sss,问矩阵中有多少路径满足:
1.1.1. 路径上的字母连起来为sss。
2.2.2.不能多次经过同一位置。
3.3.3.只能向上下左右四个方向移动。

n,∣s∣≤2000n,|s|\leq 2000n,∣s∣≤2000,答案对1e9+71e9+71e9+7取模。

前置知识:哈希,动态规划。

对于在2×n2\times n2×n的矩阵上的问题,一种常见的思路就是把一条路径拆分成多段,对每段分别求解再合并,有时需要用数据结构维护。那么对于这题,不难发现:任何一条路径都可以被划分成三段,如图所示:
在这里插入图片描述
1.1.1.蓝色部分:起点和起点左侧的部分。对于这一部分,考虑枚举起点。这一部分要么向左延伸后再回来,要么只包含起点一个点。考虑用HashHashHash判断这段路径是否合法,复杂度O(n2)O(n^2)O(n2)
2.2.2.红色部分:起点右侧,终点左侧的部分。这部分一眼看上去不是很好求,考虑用DPDPDP计算答案。设f0/1,i,j,kf_{0/1,i,j,k}f0/1,i,j,k​表示现在在(i,j)(i,j)(i,j),匹配到字符串sss的第kkk位,第一维为000表示直接从上一列过来,没有经过(i⊕1,j)(i\oplus 1,j)(i⊕1,j),第一维为111表示经过(i⊕1,j)(i\oplus 1,j)(i⊕1,j)到(i,j)(i,j)(i,j)。
则有转移方程:
f0,i,j,k=f0,i,j−1,k−1+f1,i,j−1,k−1f_{0,i,j,k}=f_{0,i,j-1,k-1}+f_{1,i,j-1,k-1}f0,i,j,k​=f0,i,j−1,k−1​+f1,i,j−1,k−1​ (Ai,j=sk)(A_{i,j}=s_k)(Ai,j​=sk​)
f1,i,j,k=f0,i⊕1,j−1,k−2+f1,i⊕1,j−1,k−2f_{1,i,j,k}=f_{0,i\oplus 1,j-1,k-2}+f_{1,i\oplus 1,j-1,k-2}f1,i,j,k​=f0,i⊕1,j−1,k−2​+f1,i⊕1,j−1,k−2​ (Ai,j=sk,Ai⊕1,j=sk−1)(A_{i,j}=s_k,A_{i\oplus 1,j}=s_{k-1})(Ai,j​=sk​,Ai⊕1,j​=sk−1​)
初始化就是通过枚举蓝色部分路径给DPDPDP赋初值。复杂度O(n2)O(n^2)O(n2)
3.3.3.绿色部分:终点和终点右侧的部分。枚举路径和蓝色部分相似,若合法则将前面对应的DPDPDP值加入答案。

一些细节:
1.1.1.注意到起点可能在终点的右侧,要将sss翻转后再算一次。
2.2.2.可能三段路径中有两段都为空,而这些路径会被重复算一次,所以这部分应单独计算。
3.3.3.当∣s∣≤2|s|\leq 2∣s∣≤2时,需要特判,这里不再赘述。
4.4.4.考虑到CFCFCF数据比较强,建议使用双哈希。
代码:

#include<iostream>
#include<string.h>
#include<algorithm>
#define gc getchar
#define pc putchar
#define pb push_back
#define f first
#define s second
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
template<class Typ> Typ &Rd(Typ &x){
	char ch=gc(),sgn=0; x=0;
	for(;ch<'0'||ch>'9';ch=gc()) sgn|=ch=='-';
	for(;ch>='0'&&ch<='9';ch=gc()) x=x*10+(ch^48);
	return sgn&&(x=-x),x;
}
template<class Typ> void Wt(Typ x){
	if(x<0) pc('-'),x=-x;
	if(x>9) Wt(x/10);
	pc(x%10^48);
}
const int N=2e3+5;
const int Md=1e9+7;
const LL B1=131,B2=237;
const LL M1=998244353,M2=1000000123;
struct HASH{LL H1,H2;}H1[2][N],H2[2][N],H[N];
int n,F[2][2][N][N],ans,len,cur;
LL P1[N],P2[N]; char s[N],A[2][N];
bool operator ==(HASH A,HASH B){return A.H1==B.H1&&A.H2==B.H2;}
HASH operator+(HASH A,HASH B){return {(A.H1+B.H1)%M1,(A.H2+B.H2)%M2};}
HASH operator-(HASH A,HASH B){return {(A.H1-B.H1+M1)%M1,(A.H2-B.H2+M2)%M2};}
HASH operator*(HASH A,HASH B){return (HASH){A.H1*B.H1%M1,A.H2*B.H2%M2};}
HASH GET1(int op,int l,int r){return H1[op][r]-H1[op][l-1]*(HASH){P1[r-l+1],P2[r-l+1]};}
HASH GET2(int op,int l,int r){return H2[op][l]-H2[op][r+1]*(HASH){P1[r-l+1],P2[r-l+1]};}
HASH GET(int l,int r){return H[r]-H[l-1]*(HASH){P1[r-l+1],P2[r-l+1]};}
void SPJ(){
	for(int i=0;i<=1;i++)
		for(int j=1;j<=n;j++)
			ans+=A[i][j]==s[1];
	Wt(ans),exit(0);
}
void GETANS(){
	memset(F,0,sizeof(F));
	for(int i=1;i<=len;i++)
		H[i]=H[i-1]*(HASH){B1,B2}\
		+(HASH){s[i]-'a'+1,s[i]-'a'+1};
	for(int i=0;i<=1;i++) for(int j=1;j<=n;j++)
		for(int k=1;k<=j&&2*k<=len;k++)
			if(GET2(i,j-k+1,j)*(HASH){P1[k],P2[k]}\
			+GET1(i^1,j-k+1,j)==GET(1,2*k))
				F[1][i^1][j][2*k]++,(2*k==len)&&cur++;
	for(int i=0;i<=1;i++) for(int j=1;j<=n;j++)
		if(A[i][j]==s[1]) F[0][i][j][1]++;
	for(int k=1;k<=len;k++) for(int j=1;j<=n;j++)
		for(int i=0;i<=1;i++) if(A[i][j]==s[k]){
			(F[0][i][j][k]+=F[0][i][j-1][k-1])%=Md;
			(F[0][i][j][k]+=F[1][i][j-1][k-1])%=Md;
			if(k>1&&A[i^1][j]==s[k-1]){
				(F[1][i][j][k]+=F[0][i^1][j-1][k-2])%=Md;
				(F[1][i][j][k]+=F[1][i^1][j-1][k-2])%=Md;
			}
		}
	for(int i=0;i<=1;i++) for(int j=1;j<=n;j++)
		for(int k=1;k<=n-j+1&&2*k<=len;k++)
			if(GET1(i^1,j,j+k-1)*(HASH){P1[k],P2[k]}\
			+GET2(i,j,j+k-1)==GET(len-2*k+1,len)){
				(ans+=(F[0][i^1][j-1][len-2*k]+\
				F[1][i^1][j-1][len-2*k])%Md)%=Md;
				if(2*k==len&&len>2) cur++;
			}
	for(int i=0;i<=1;i++) for(int j=1;j<=n;j++)
		if(A[i][j]==s[len]) (ans+=(F[0][i][j-1][len-1]+\
			F[1][i][j-1][len-1])%Md)%=Md;
}
int main(){
	P1[0]=P2[0]=1;
	for(int i=1;i<N;i++) P1[i]=P1[i-1]*B1%M1;
	for(int i=1;i<N;i++) P2[i]=P2[i-1]*B2%M2;
	scanf("%s%s%s",A[0]+1,A[1]+1,s+1);
	n=strlen(A[0]+1),len=strlen(s+1); if(len==1) SPJ();
	for(int i=0;i<=1;i++) for(int j=1;j<=n;j++)
		H1[i][j]=H1[i][j-1]*(HASH){B1,B2}\
		+(HASH){A[i][j]-'a'+1,A[i][j]-'a'+1};
	for(int i=0;i<=1;i++) for(int j=n;j>=1;j--)
		H2[i][j]=H2[i][j+1]*(HASH){B1,B2}\
		+(HASH){A[i][j]-'a'+1,A[i][j]-'a'+1};
	GETANS(),reverse(s+1,s+len+1),GETANS(),Wt((ans+cur/2)%Md);
	return 0;
}
注意力机制模块:CVPR 2026 新宠:MLLA(多尺度线性注意力)即插即用,在 YOLO 和 ConvNeXt 上全面涨点 MLLA核心创新点与实践价值摘要(146字) 清华大学LeapLab团队通过解构Mamba模型,发现其核心优势源于遗忘门机制与块设计,而非传统SSM架构。基于此提出的MLLA模块创新性地将这两项设计融入线性注意力框架:1)用位置编码替代循环计算保留遗忘门的位置感知能力;2)通过门控投影+DWConv+MLP重构高效块结构。在COCO检测任务中,MLLA使小目标AP提升11.6%而仅损失6%FPS,支持ONNX/TensorRT全链路部署,代码已开源。该工作为高分辨率视觉任务提供了近乎零代价的性能提升方案。 阅读详情

相关推荐

机械臂算法设计MATLAB|运动学动力学|轨迹规划|路径规划|Simulink

RRT为最常用的路径规划算法,还有其变种(RRT*,RRT-connect等)。RRT是一种多维空间中高效的规划方法。它以一个初始点作为根节点,通过随机采样增加叶子节点的方式,生成一个随机扩展树。随机扩展树不断增长,直到到达目的位置。**Step1:**构建多维状态空间(joint space),**Step2:**构建joint space的障碍检测算法**Step3:**在joint space应用RRT。

qq_35997213的博客 4476

cf 613E - Puzzle Lover

Description 一个\(2*n\)的方格矩阵,每个格子里有一个字符 给定一个长度为\(m\)的字符串\(s\) 求在方格矩阵中,有多少种走法能走出字符串\(s\) 一种合法的走法定义为:从任意一个位置出发,每次只能走到相邻的格子(common side),一个格子不能经过多次 \(n,m\le 2000\) Analysis 刚做完一道百度之星题,跟这题很像,都是一个\(n^2​\)的dp...

weixin_30732487的博客 166

rsyslog交叉编译(armv7、armv8、aarch64、arm32平台通用)

该文档描述了如何交叉编译rsyslog到arm64嵌入式平台。

sinat_33909696的博客 1560

[CF 613 Div.1E] Puzzle Lover

这道题目……感觉细节爆炸级别的多啊……要不是去找人要了代码感觉都要调不出来了 题意 有一个\(2\times N\)的网格,其中每个网格上面都有一个字符,问上下左右走,能够走出多少个给定的字符串\(S\)?答案对\(10^9+7\)取模。 \(1\leq N \leq 2\times 10^3\) 分析 实际上可以发现,这样的路径肯定最多就是长这样的形式:左边一段绕回来的路径,中间一段可以上下...

weixin_34376986的博客 152

2024最新实战:用1Panel面板+Docker快速部署Frps服务端(含Nginx配置模板)

本文详细介绍了2024年企业级内网穿透方案,通过1Panel面板和Docker技术快速部署Frps服务端,包含Nginx反向代理配置模板。从服务器选型、系统准备到安全加固,提供全栈实战指南,帮助企业和开发者高效实现内网穿透需求。

weixin_27966471的博客 419

Python爬虫案例:从39问医生网爬取口腔科的在线问答记录(单轮问答)

本次实验爬取39问医生网中口腔科分类下的所有在线单轮问答记录,每页32条,共100页,总数据量为3200条,最终结果以excel格式保存。

JieBao11的博客 1640

cf613 E Delete a Segment

题意 有(n<=1e5)(n<=1e5)(n<=1e5)个区间,要求删掉一个区间,使剩下的区间不覆盖的个数。 思路 2中做法 线段树 首先给出的区间是乱序的,对其排个序,然后我们可以一次枚举删掉这个区间,然后求剩下的区间所剩的个数。可以用线段树来进行更新查询,可以类似求区间连续01个数那种方式,但我们由于这里是区间,所以把点化为区间,把区间扩大2倍[2l,2r],然后多加入这个[...

nofuck的博客 242

机器人控制仿真软件:MATLAB Simulink Control System Toolbox_(1).MATLAB基础知识

MATLAB(Matrix Laboratory)是由MathWorks公司开发的一种高性能数值计算和可视化软件。它广泛应用于科学计算、工程设计、信号处理、控制系统设计、图像处理等领域。强大的矩阵运算能力:MATLAB的核心是矩阵运算,能够高效处理大规模的数值数据。丰富的工具箱:MATLAB提供了大量的工具箱,如Control System Toolbox、Simulink、Signal Processing Toolbox等,这些工具箱覆盖了多个应用领域。易于使用的图形界面。

kkchenjj的博客 904

CF613E-动态更新

题意:一开始有一个初始顺序的排列[1,n],一共有m次操作,每次将数ai从序列中取出,放到最开头的位置生成一个新的排列。求问在所有过程中每一个数最小的下标位置和最大的下标位置。题解:首先,最小坐标很容易求,若序列m中出现过,那么最小值就是1,否则最小值就是他开始的值,因为每个数他要么是被移动到第一个,要么就只有可能往后挪了。最大坐标是重点,我们动态维护一个now数组为当前某个数的当前位置.可以分成...

qq_35577488的博客 165

1.5 RAG技术栈全景图:LangChain vs LlamaIndex深度对比,选错框架后悔3年,一文帮你选对

摘要:LangChain与LlamaIndex框架深度对比 本文全面对比了RAG领域两大主流框架LangChain和LlamaIndex。LangChain是通用AI应用框架,具有模块化设计和丰富生态;LlamaIndex专为RAG优化,提供开箱即用解决方案。功能对比显示,LangChain在文档加载和Agent支持方面更强,而LlamaIndex在检索策略、向量存储和多模态处理上表现更优。代码示例展示了二者实现RAG的不同方式:LangChain需要更多配置但灵活性高,LlamaIndex则提供更简洁的A

yonggeit的博客 3238

YOLOv8【第十一章:视频追踪与流处理篇·第16节】一文搞懂,DeepStream 部署入门:NVIDIA 视频分析 SDK 与 YOLOv8 结合!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 838

IOI2020集训队作业-12 (CF613E, AGC033E, AGC022D)

A - CF613E Puzzle Lover Sol 合法的序列一定是下面这样的形式: 其中第二部分要求只能够向上、下、右走。 第一部分和第三部分可以用哈希/SA快速判断是否可以匹配,第二部分只能从第iii列走到第i+1i+1i+1列,分三个阶段进行dpdpdp就可以了。 考虑第二部分从右往左的情况,我们可以将www翻转然后再计算一次。 注意只有第一部分或只有第三部分将会被数两遍(不翻转www...

这个博客已经搬到了:zhongyuwei.github.io 544

YOLOV8改进:添加Wiseiou,有效涨点

【代码】YOLOV8改进:添加Wiseiou,有效涨点。

AIcurator的博客 2391

题解 - CF613E Puzzle Lover

CF613E Puzzle Lover\mathrm{CF613E\ Puzzle \ Lover}CF613E Puzzle Lover 头铁地去做一道∗3200*3200∗3200的题,没想到还是比较好想~~(看题解~~ 题目意思 题目传送门 就是给你一个2×n2\times n2×n的字符矩阵,以及给你个mmm的字符串ttt。问你有多少种方案使得路径上的字符连接起来的字符串为ttt(每次可以往上下左右走,但不能走到同一格)。答案对1e9+71e9+7

wangyiyang2的博客 223

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

NOI模拟 字符矩阵

原题cf613e 官方题解 神级DPDPDP。把一条匹配路径分为左中右三段,左边和右边都是往一个方向走一段然后返回,而中间就是往一个方向蛇皮走位。 于是串分两个方向两次DPDPDP。 注意DPDPDP的细节判断,以及哈希区间的左右方向。对于mmm较小的情况可以直接算。记得要双哈希,我太难了。 #include<bits/stdc++.h> using namespace std; #d...

g21wcr的博客 159

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

题解 - CF613D Kingdom and its Cities

题解 - CF613D Kingdom and its Cities\mathrm{CF613D \ Kingdom \ and \ its \ Cities}CF613D Kingdom and its Cities 一道 虚树+树形DP好题。 题目意思 戳这里 Sol\mathrm{Sol}Sol 这道题目的...

wangyiyang2的博客 306

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【CF613D】Kingdom and its Cities

【CF613D】Kingdom and its Cities 题面 洛谷 题解 看到关键点当然是建虚树啦。 设\(f[x]\)表示以\(x\)为根的子树的答案,\(g[x]\)表示以\(x\)为根的子树内是否有和\(x\)联通的点,\(c=\sum_{v\in son_x} g[v]\)。 分类讨论一下: 如果一个点在原树下它和它的父亲均为关键点,那么显然不行。 这个点是关键点,\(f...

228

【CF613D】Kingdom and its Cities 虚树+树形DP

【CF613D】Kingdom and its Cities 题意:给你一棵树,每次询问给出k个关键点,问做多干掉多少个非关键点才能使得所有关键点两两不连通。 $n,\sum k\le 10^5$ 题解:刷虚树板子啦! 首先如果两个关键点相邻则无解。然后建出虚树,进行树形DP。设f[i]表示i子树中的关键点都不连通,且i子树中的点与外面的点也不连通的最小花费,g[i]表示i子树重...

aodanchui1057的博客 422

【CF613E】Puzzle Lover(哈希)(DP)

传送门 CF今天好像挂了in queue了评测都有5页。 下面的代码通过了校内OJ的测试,应该没什么问题,好像数据就是从CF上扒下来的来着 题解: 考虑合法的路径一定满足左边一个UUU,右边一个UUU,中间是蛇形。 枚举左边合法的UUU和中间的每个格子进行转移,f[0/1][i][j]f[0/1][i][j]f[0/1][i][j]表示当前在(0/1,i)(0/1,i)(0/1,i)这个格子,匹...

zxyoi_dreamer的博客(不定期诈尸) 335

【CF613D】Kingdom and its Cities(虚树,动态规划)

【CF613D】Kingdom and its Cities(虚树,动态规划) 题面 洛谷 CF 翻译洛谷上有啦 题解 每次构建虚树,首先特判无解,也就是关键点中存在父子关系。 考虑\(dp\),设\(f[i]\)表示解决\(i\)子树以内的最小点数 再用一个数组\(g[i]\)表示\(i\)的子树中还未阻断的点数 \(f[u]=\sum f[v],g[u]=\sum g[v]\) 考虑转移, 如...

weixin_30871293的博客 146

[CF613A Peter and Snow Blower] 题解

[CF613A Peter and Snow Blower] 题解

pink_polar_bear 的博客 316

CF613D Kingdom and its Cities

题目描述: luogu cf 题解: 虚树上dp。 建虚树没啥说的。 那么dp状态? 考虑dfs时返回一个值,代表这个子树上面需不需要隔断。 如果当前点可以占,那么有至少两个这种子树时应该选这个点并返回0,要不然返回1; 如果不能占,直接加到dp值上,然后返回1即可。 代码: #include<cstdio> #include<cstri...

a6t2007的博客 197

Skills - CF613B

Lesha plays the recently published new version of the legendary game hacknet. In this version character skill mechanism was introduced. Now, each player character has exactly n skills. Each skill is...

weixin_30553777的博客 159

CF613D Kingdom and its Cities(虚树+贪心)

题目链接 很休闲的一个题啊 其实一看到关于∑k\sum k∑k的限制,就知道是个虚树的题了 首先我们把虚树建出来,然后考虑怎么计算个数呢? 我们令f[x]f[x]f[x]表示以xxx的子树中,剩余了多少个还没有切断的关键点 首先,如果当前点是一个关键点的话,那么他所有的f[son]!=0f[son]!=0f[son]!=0的儿子都需要割掉,而且当前点的f[x]f[x]f[x]应该是1(因为只能删除...

y_immortal的博客 QwQ(qdez_ymh) 374
下一篇: Ynoi2019模拟赛题解
-Autisia-
博客等级 码龄5年 1粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值