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. 使用rem配置PC端自适应大屏

    效果如下 使得大屏不论在什么宽高比例依然能展示全部数据 安装 npm install -S postcss-pxtorem rem配置思路 原先的rem函数是能解决大部分的问题的,如果展示不全,也可以 ...

  2. mysql截取函数常用方法 即mysql 字符串 截取-- - 最后带上java字符串截取规则比较

    常用的mysql截取函数有:left(), right(), substring(), substring_index() 下面来一一说明一下: 1.左截取left(str, length) 说明:l ...

  3. sqli-labs通关教程----41~50关

    第四十关 与前几关一样,闭合变成') 插入数据 ?id=1') ;insert into users(id,username,password) values('17','aaa','bbb'); % ...

  4. 关于Python+selenium 定位浏览器弹窗元素

    首先要确定弹窗的类型: (1)div弹窗 (2)新标签页弹窗 (3)alert弹窗 一,div弹窗div弹窗是浏览器中比较好定位的弹窗,定位的方法与普通的元素一样.不过这里会有一个坑,明明可以找到这个 ...

  5. C++枚举算法

    枚举算法 什么是枚举? 枚举,顾名思义,就是用最笨的方法,去解决问题(暴力枚举),一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数.这两种类型经常(但不总是)重叠. 枚举 ...

  6. Flutter Weekly Issue 52

    教程 一个易迁移.兼容性高的 Flutter 富文本方案 复杂业务如何保证Flutter的高性能高流畅度? 插件 flutter_color_models A wrapper for the Dart ...

  7. 使用redis-dump与redis-load方式迁移redis数据库

    实际生产场景中,有可能会因为迁移机房或者更换物理机等原因需要在生产环境迁移redis数据.本文就来为大家介绍一下迁移redis数据的方法. 迁移redis数据一般有如下3种方式: 1.第三方工具red ...

  8. 3. JS生成32位随机数

    function randomWord ( randomFlag,min,max ) { var str = " ", range = min, arr = ['0','1','2 ...

  9. HBase Filter 过滤器概述

    abc 过滤器介绍 HBase过滤器是一套为完成一些较高级的需求所提供的API接口. 过滤器也被称为下推判断器(push-down predicates),支持把数据过滤标准从客户端下推到服务器,带有 ...

  10. 从零开始学习docker之docker的安装

    一.Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程 ...