CF1336C Kaavi and Magic Spell

区间dp

题意

给一个长度为 \(n\) 的字符串 \(S\) 和一个长度为 \(m\) 的字符串\(T\) ,\(1\le m\le n\),然后开始有一个空串 \(A\),接下来可对 \(S\) 串进行 $n4 次操作:

  • 把S的首个字符添加到A的开头然后删掉

  • 把S的首个字符添加到A的尾端然后删掉

问在操作过程中使得 \(A\) 的前 \(m\) 个字符为 \(T\)(也就是前缀为 \(T\))的情况共有多少?

长度不同或者是操作序列中有某个地方不同可视为是不同情况。


我们先让 \(T\) 的长度和 \(S\) 相同,在多处来的那 \(m+1,m+2,\cdots,n\) 那几位上,钦定它和 \(S\) 中所有元素都“相等”,因为在这些位置上我们可以取任意值

设计状态:\(f(l,r)\) 表示的是满足 \(\forall l\le i\le r,S_i=T_i\) 能构造出多少操作序列

那么假设我们在删除 \(S_i\) 并把它往 \(A\) 里添加,此时 \(A\) 中一定有了 \(i-1\) 个元素

考虑 \(f(l,r),r-l+1=i\) 可以由什么状态转移而来

  • \(S_i=T_l\),则可以把 \(S_i\) 添加到这个 \([l+1,r]\) 区间的前面,构成 \([l,r]\),就是 \(f(l,r)+=f(l+1,r)\)
  • \(S_i=T_r\),这和上面就一样了,\(f(l,r)+=f(l,r+1)\)

基本已经完成了,现在考虑初始状态和答案

\(f(i,i)=2[S_i=T_i]\),就是说一种方法是把 \(S_1\) 从前面添加到 \(A\) 的第一个元素,一种是从后面添加,虽然结果一样,但是题目要求这是两种不同方式

长度不同算不同情况,这也说明了不一定要操作 \(n\) 次,只要操作 \(i,m\le i\le n\) 次就行了

所以答案是 \(\sum_{i=m}^{n}f(1,i)\)

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<map>
#include<iomanip>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
register int x=0;register int y=1;
register char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
#define mod 998244353
char s[3006],t[3006];
int f[3006][3006];
int main(){
std::scanf("%s",s+1);std::scanf("%s",t+1);
int n=std::strlen(s+1),m=std::strlen(t+1);
for(reg int i=1;i<=m;i++) f[i][i]=(s[1]==t[i])<<1;
for(reg int i=m+1;i<=n;i++) f[i][i]=2;
for(reg int i=2,len=2;i<=n;i++,len++){
for(reg int l=1,r=len;r<=n;l++,r++){
if(l>m||s[i]==t[l]) f[l][r]+=f[l+1][r],f[l][r]%=mod;
if(r>m||s[i]==t[r]) f[l][r]+=f[l][r-1],f[l][r]%=mod;
}
}
int ans=0;
for(reg int i=m;i<=n;i++) ans=(ans+f[1][i])%mod;
std::printf("%d",ans);
return 0;
}

CF1336C Kaavi and Magic Spell的更多相关文章

  1. CF R 635 div1 C Kaavi and Magic Spell 区间dp

    LINK:Kaavi and Magic Spell 一打CF才知道自己原来这么菜 这题完全没想到. 可以发现 如果dp f[i][j]表示前i个字符匹配T的前j个字符的方案数 此时转移变得异常麻烦 ...

  2. Codeforces Round #635 (Div. 2)部分(A~E)题解

    虽然打的是div1,但最后半小时完全处于挂机状态,不会做1C,只有个 \(O(n^3)\) 的想法,水了水论坛,甚至看了一下div2的AB,所以干脆顺便写个div2的题解吧,内容看上去还丰富一些(X) ...

  3. Codeforces Round #635 (Div. 1)

    传送门 A. Linova and Kingdom 题意: 给定一颗以\(1\)为根的树,现在要选定\(k\)个结点为黑点,一个黑点的贡献为从他出发到根节点经过的白点数量. 问黑点贡献总和最大为多少. ...

  4. Codeforces Round #327 (Div. 2) A. Wizards' Duel 水题

    A. Wizards' Duel Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/591/prob ...

  5. cf591A Wizards' Duel

    A. Wizards' Duel time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  6. 无法推动项目起步?Let's try McDonald’s Theory

    McDonald’s Theory I use a trick with co-workers when we’re trying to decide where to eat for lunch a ...

  7. CSUOJ 1008 Horcrux

    Description A Horcrux is an object in which a Dark wizard or witch has hidden a fragment of his or h ...

  8. EOJ Monthly 2018.8 D. Delivery Service-树上差分(边权/边覆盖)(边权转点权)(模板题)

    D. Delivery Service 单测试点时限: 2.5 秒 内存限制: 512 MB EOJ Delivery Service Company handles a massive amount ...

  9. CSU1008: Horcrux

    Description A Horcrux is an object in which a Dark wizard or witch has hidden a fragment of his or h ...

随机推荐

  1. MTK Android Driver :Key

    MTK Android Driver :Key 1.按键配置(根据原理图):DCT(Driver Customization Tool): ..\mediatek\custom\prj\kernel\ ...

  2. CVPR2018关键字分析生成词云图与查找

    今日目标:爬取CVPR2018论文,进行分析总结出提到最多的关键字,生成wordCloud词云图展示,并且设置点击后出现对应的论文以及链接 对任务进行分解: ①爬取CVPR2018的标题,简介,关键字 ...

  3. JAVA中的==和queals()的区别

    一.先来说说Java的基本数据类型和引用类型 八大基本数据类型:Byte,short,int,long,double,folat,boolean,char,其中占一个字节的是byte,short和ch ...

  4. 34 io流-- 打印流和对象流

    概述 io流分为字符流和字节流,具体分类相见下图 字符流:char 一些基本文本的数据传输 字节流:byte 图片.视频等用文本查看器查看不了的文件都是二进制文件,只能用字节流传输,使用字符流cp的看 ...

  5. 15-场景中用到的资源监视器(perfmon metrics collector)

    JMeter 无法提取除 Tomcat 之外的其他服务器的指标,因此PerfMon Metrics Collector可用来获取性能数据. PerfMon Metrics Collector使用的是S ...

  6. sigmod函数求导

    sigmod函数: \[f(z)=\frac{1}{1+e^{-z}} \] 求导: \[\frac{\partial f(z)}{\partial z}=\frac{-1*-1*e^{-z}}{(1 ...

  7. 智能指针 shared_ptr

    1.不支持数组 2.c++11支持make_shared,分配一次内存,构造函数为private和proteced时不能调用. 3.new初始化分配两次内存,一.分配数据块内存,二.分配控制块内存

  8. 本地项目推送到Github

    1.在github上repositories新建一个git项目工程 2.使用git,把刚建好的项目clone到本地 3.把本地项目中的文件全部移动到下载下来的git项目中,以下是我本地项目中的文件 4 ...

  9. 【three.js第六课】物体3D化

    1.在[three.js第五课]的基础上引入AnaglyphEffect.js文件. 文件路径: three源码包中进入[examples]文件夹: 进入[js]文件夹: 进入[effects]文件夹 ...

  10. Flask基础-01.Flask简介

    Flask简介 Web应用程序作用 Web(World Wide Web)诞生最初的目的,是为了利用互联网交流工作文档. 关于Web框架 1. 什么是Web框架? 1. 已经封装好了一段代码,协助程序 ...