[NOI online2022普及C]字符串
题目描述
Kri 非常喜欢字符串,所以他准备找 \(t\) 组字符串研究。
第 \(i\) 次研究中,Kri 准备了两个字符串 \(S\) 和\(R\) ,其中 \(S\) 长度为 \(n\),且只由 \(0, 1, -\) 三种字符构成(注:这里的第三种字符是减号),\(R\) 初始时为空。
每次研究,Zay 会带着一个美丽的长度为 \(m\) 的字符串 \(T\) 来找 Kri 玩,Kri 非常羡慕 Zay 拥有如此美丽的字符串,便也想用字符串 \(S\) 和 \(R\) 变出字符串 \(T\)。
具体地,Kri 将会进行 \(n\) 次操作。每次操作中,Kri 会取出 \(S\) 的第一个字符(记为 \(c\)),并将其从 \(S\) 中删去。如果 \(c = \texttt{-}\),则 Kri 要删去 \(R\) 的开头字符或结尾字符(数据保证删去后 \(R\) 不为空)。否则,Kri 会将 \(c\) 加入到 \(R\) 的末尾。
当进行完所有操作后,Kri 会检查 \(R\) 是否和 \(T\) 相等。如果 \(R=T\),Kri 就会感到开心;否则,Kri 会感到难受。
请问在每次研究中,Kri 有多少种操作方式使自己最后感到开心?我们定义两种方案不同,当且仅当在某种方案的某次操作中, Kri 删去了 \(R\) 的开头字符。而在另一种方案的这次操作中, Kri 删去了 \(R\) 的结尾字符。
由于答案可能很大,你只需要输出答案除以 \(1,000,000,007\)(即 \(10^9+7\))的余数。
输入格式
第一行一个正整数 tt。
接下来有 tt 组数据分别表示 tt 次字符串的研究,对于每组数据:
第一行有两个正整数 n,mn,m,分别表示字符串 S,TS,T 的长度。
第二行是字符串 SS。
第三行是字符串 TT。
输出格式
共 tt 行,第 ii 行表示第 ii 组研究的答案。
输入输出样例
输入 #1
3
6 2
10-01-
01
7 3
010-1-1
101
6 4
111-00
1100
输出 #1
2
1
2
输入 #2
见附件中的 string2.in
输出 #2
见附件中的 string2.out
说明/提示
【样例 1 解释】
对于第一组数据,有以下两种方案:
第一个 - 删 \(R\) 的开头,第二个 - 删 \(R\) 的结尾。
第一个 - 删 \(R\) 的结尾,第二个 - 删 \(R\) 的开头。
【数据范围】
对于 \(20\%\) 的数据,\(n,m\le 15\)。
对于 \(30\%\) 的数据,\(n,m\le 30\)。
对于 \(70\%\) 的数据,\(n,m\le 80\)。
对于另 \(10\%\) 的数据,保证答案不超过 \(1\)。
对于 \(100\%\) 的数据,\(1\le t\le 5\),\(1\le n,m\le 400\)。
每一个字符有几种可能。要不就是在前面被删去,要不就是在后面被删去,要不就是保持着不被删去。设现在有\(x\)个已匹配,\(y\)个在前面被删,\(z\)个在后面被删。然后做dp。我们来考虑在哪些情况下能执行那些操作。
首先如果现在遇到了一个减号,那么在前面的数只能在有可以删的数时才能删,后面的数同理。这个转移相对简单。
如果不是减号呢?首先如果我们要把它归为不被删去的数,就要把他与匹配串的下一位比较,如果一样才可以转移。同时必须后面没有要被删的数。
如果我们要把它归为在前面删的数,那么就要在既没有不被删的数也没有在后面删的数时,这个数才能在前面删。
如果我们把它归为在后面删的数,其实什么时候都可以。然后我们的dp就完成了。
当这个dp如果加上计算已经到达了哪一位这一维度,看似会超时,当其实,我们可以通过x,y,z算出到了哪一位置,把他们全部加起来就好了。
#include<cstdio>
#include<cstring>
const int N=405,P=1e9+7;
char c[N],s[N];
int t,n,m,f[N][N][N];
int dfs(int t,int x,int y,int z)
{
if(t==n)
return x==m;
int ret=0;
if(f[t][x][y]!=-1)
return f[t][x][y];
if(c[t]=='-')
{
if(y)
ret+=dfs(t+1,x,y-1,z);
if(z)
ret+=dfs(t+1,x,y,z-1);
return f[t][x][y]=ret%P;
}
if(c[t]==s[x]&&!z)
ret=dfs(t+1,x+1,y,z);
ret=(ret+dfs(t+1,x,y,z+1))%P;
if(!x&&!z)
ret=(ret+dfs(t+1,x,y+1,z))%P;
return f[t][x][y]=ret;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d%s%s",&n,&m,c,s);
memset(f,-1,sizeof(f));
printf("%d\n",dfs(0,0,0,0));
}
}
[NOI online2022普及C]字符串的更多相关文章
- [NOI.AC#34]palinedrome 字符串hash+贪心
容易看出,只要从两边往中间扫描,碰到相等的就直接分割然后加入答案即可,判断相等用字符串hash #include<bits/stdc++.h> #define REP(i,a,b) for ...
- 牛客网NOIP赛前集训营-普及组(第一场)
前三题略 T4: 题目描述 小A有n个长度都是L的字符串.这些字符串只包含前8个小写字符,'a'~'h'.但这些字符串非常的混乱,它们几乎长得互不相同.小A想通过一些规则,让它们长得尽可能相同.小A现 ...
- [CQOI2014][bzoj3507] 通配符匹配 [字符串hash+dp]
题面 传送门 思路 0x01 KMP 一个非常显然而优秀的想法:把模板串按照'*'分段,然后对于每一段求$next$,'?'就当成可以对于任意字符匹配就行了 对于每个文本串,从前往后找第一个可以匹配的 ...
- CSP2019-S2参赛总结 暨 近期学习反思
前言 岁月不居,时节如流.眨眼间,2019的联赛就已经落下帷幕了,回忆这一年的学习,有许许多多的事情想写下来.趁联赛结果还未出来,赶紧写下这篇文章,以记录我这段时间的学习和生活. "你怎么又 ...
- noi题库(noi.openjudge.cn) 1.7编程基础之字符串T31——T35
T31 字符串P型编码 描述 给定一个完全由数字字符('0','1','2',-,'9')构成的字符串str,请写出str的p型编码串.例如:字符串122344111可被描述为"1个1.2个 ...
- NOI 1.7编程基础之字符串(35题)
01:统计数字字符个数 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一行字符,统计出其中数字字符的个数. 输入 一行字符串,总长度不超过255. 输出 ...
- noi题库(noi.openjudge.cn) 1.7编程基础之字符串T21——T30
T21:单词替换 描述 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写.现需要将其中的某个单词替换成另一个单词,并输出替 ...
- 字符串(后缀自动机):NOI 2016 优秀的拆分
[问题描述] 如果一个字符串可以被拆分为 AABB 的形式,其中 A 和 B 是任意非空字符串, 则我们称该字符串的这种拆分是优秀的. 例如,对于字符串 aabaabaa,如果令 A = aab, B ...
- 几何+暴力【p1959】 遗址[NOI导刊2009普及(6)]
题目描述--> P1959 遗址_NOI导刊2009普及(6) 普通方法分析: 因为题目要求是找最大正方形(如果是长方形更麻烦. 讲真,题目不难,耗时间! 根据题目要求,我们要找的是正方形. 我 ...
- noi 题库1.7字符串 第16至20题
16:忽略大小写的字符串比较 一般我们用strcmp可比较两个字符串的大小,比较方法为对两个字符串从前往后逐个字符相比较(按ASCII码值大小比较),直到出现不同的字符或遇到'\0'为止.如果全部字符 ...
随机推荐
- 《Python魔法大冒险》 001 序章:少年小鱼的不平凡一天
在一个普通的城市里,生活着一个名叫小鱼的少年.他是一名初中生,但在班级里,他的学习成绩总是垫底.同学们经常取笑他,有时甚至戏称他为"倒数王". 放学后,小鱼一个人走在回家的路上,他 ...
- JDK21来了!附重要更新说明
JDK21 计划23年9月19日正式发布,虽然一直以来都是"版本随便出,换 8 算我输",但这么多年这么多版本的折腾,如果说之前的 LTS版本JDK17你还觉得不香,那 JDK21 ...
- Note -「网络流 flows」
基本没有严谨证明. Part. 1 概念 Part. 1-1 流网络 流网络是一个有向图(不考虑反向边),我们把这个图记为 \(G=(V,E)\). 其中有两个特殊的点 \(s,t\),分别成为源点和 ...
- redis基本数据类型 set类型
127.0.0.1:6379> SADD s1 a b c (integer) 3 127.0.0.1:6379> SMEMBERS s1 1) "b" 2) &quo ...
- 5分钟入门 next13
上半年vercel 推出了nextjs13 这个大版本,刚好最近有个c端的项目,所以就用了这个框架来写,技术体系基本也是文档提到的 tailwindcss + ts + swr + ssr ,总的来开 ...
- Mysql忘记密码后如何重置密码
长时间不使用本机的Mysql后把密码忘记了咋整?直接上干货: 第一步(Mysql部署的位置,若自己能找到就忽略这一步):任务管理器中也可以找到 第二步:修改配置文件 在my.ini末尾加上 skip- ...
- IPv6的基本认识
IPv6 1.IPv6的基本认识 IPv4 位数是 32位,4字节,能够提供的IP地址大约是42亿,但你知道的,如今一个人都不止一个IP地址,看看如今设备的数量及发展速度就知道,所以有了IPv6,IP ...
- cmake构建32位应用程序
1. 背景介绍 2. 工具介绍 3. 环境搭建 4. MinGW编译器版本 1. 背景介绍 最近需要使用第三方动态库文件G33DDCAPI.dll进行二次开发.由于这个动态库文件生成的时间比较早,且只 ...
- 深入理解 python 虚拟机:原来虚拟机是这么实现闭包的
深入理解 python 虚拟机:原来虚拟机是这么实现闭包的 在本篇文章当中主要从虚拟机层面讨论函数闭包是如何实现的,当能够从设计者的层面去理解闭包就再也不用死记硬背一些闭包的概念了,因为如果你理解闭包 ...
- mooc第五单元《管理组织》单元测试
第五单元<管理组织>单元测试 返回 本次得分为:30.00/50.00, 本次测试的提交时间为:2020-08-30, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 ...