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. Flask 入门 (十一)

    上篇文章讲的是一对多,这篇文章应该说多对多了 但是多对多无法用两张表来实现,因为外键......,你懂,哈哈哈!,所以中间需要加一张表来实现 承接上文,修改main.py中的代码如下: #encodi ...

  2. Js异步机制的实现

    Js异步机制 JavaScript是一门单线程语言,所谓单线程,就是指一次只能完成一件任务,如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推.这种模式的好处是实现起来比较简单 ...

  3. Jquery+php鼠标滚动到页面底部自动加载更多内容,使用分页

    1.index.php <style type="text/css"> #container{margin:10px auto;width: 660px; border ...

  4. F - Pearls HDU - 1300

    简单dp. 题目大意:有n种珍珠,这n种珍珠有不同的需求量,不同的价格,价格越高,质量越高,在购买每一种珍珠时,都需要在原来的基础上多买10个.也就是说如果需要买x种珍珠,那就要付x+10个的钱.每一 ...

  5. windows批处理protoc生成C++代码

    1 首先需要生成protoc的可执行文件,具体可以参考  https://www.cnblogs.com/cnxkey/articles/10152646.html 2 将单个protoc文件生成.h ...

  6. python的历史和下载python解释器

    一.python的诞生 1.Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,创造了一种C和sh ...

  7. [V&N2020 公开赛]TimeTravel 复现

    大佬友链(狗头):https://www.cnblogs.com/p201821440039/ 参考博客: https://www.zhaoj.in/read-6407.html https://cj ...

  8. 不停机还能替换代码?6年的 Java程序员表示不可思议

    相信很多人都有这样一种感受,自己写的代码在开发.测试环境跑的稳得一笔,可一到线上就抽风,不是缺这个就是少那个反正就是一顿报错,而线上调试代码又很麻烦,让人头疼得很.不过, 阿里巴巴出了一款名叫Arth ...

  9. js html生成图片

    我自己分装好的方法,外链自己去下: /** * !!!使用前请导入jq文件!!! 海报生成, 二维码链接生成 */ document.write('<script src="/Publ ...

  10. python 开发一款图片压缩工具(四):上传图床

    上一篇使用了 pngquant 图片压缩工具进行压缩,并通过 click 命令行工具构建了 picom 包.这篇的主要功能是实现图片上传. 图片上传功能的实现 通过 pngquant 压缩图片后,得到 ...