神仙题。

考虑在一棵 Trie 上进行染色,将可能出现的串的末尾染成黑色。答案就是黑点的个数。一开始只有 \(A\) 的末尾点是黑色。

当出现一个字符(不是退格)\(c\) 时,就要将每个黑点的 \(c\) 儿子都染成黑色。

然而这样一个点可能会有重复染色,不能直接乘 \(2\)。

不妨记录一个 \(f[c]\) 表示有儿子 \(c\) 且该儿子是黑色的点的个数。

那么此时答案 \(ans\) 应该变成 \(2ans-f[c]\)(减掉已经是黑的儿子 \(c\) 的个数),同时更新一下 \(f[c]\),就是原来的 \(ans\)(原来的每个黑点都有一个黑儿子 \(c\))。其它的 \(f\) 不变。

当出现退格时:

退格实际上就是回到 Trie 上的父亲。

我们发现,一个字符不打,和打了再被退格是一样的。所以退格有用,当且仅当它删掉的是原来 \(A\) 串里的字符。

再仔细分析一波,如果是第 \(x\) 个退格,那么收到影响的点只有 \(A[n-x+1]\) 这个点。

(可以通过 Trie 理解,除了最浅的黑点,其它的黑点的父亲肯定都是黑点,所以只用考虑最浅的黑点,也就是 \(A[n-x+1]\) 这个点)

对这个点瞎搞一波就行了。

时间复杂度 \(O(n+m)\)。

#include<bits/stdc++.h>
using namespace std;
const int maxn=5000500,mod=19260817;
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
int x=0,f=0;char ch=getchar();
while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar();
while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar();
return f?-x:x;
}
int n,m,f[26],ans=1,at;
char a[maxn],b[maxn];
int main(){
at=n=read();m=read();
scanf("%s%s",a+1,b+1);
FOR(i,1,m){
int c=b[i]-'A';
if(c<=25){
int tmp=f[c];
f[c]=ans;
ans=(2*ans-tmp+mod)%mod;
}
else{
if(!at) continue;
f[a[at]-'A']=(f[a[at]-'A']+1)%mod;
ans=(ans+1)%mod;
at--;
}
}
printf("%d\n",ans);
}

洛谷4965 薇尔莉特的打字机(Trie,DP)的更多相关文章

  1. P4965 薇尔莉特的打字机

    题目 P4965 薇尔莉特的打字机 快到十二点了正在颓废突然发现了一道好题 虽然毒瘤,但确实是容斥原理的好题啊,做法也特别巧妙(标程 思路 题目大意(怕自己突然忘) n个初始字符,m个操作(加入或删除 ...

  2. 洛谷P3959 宝藏(NOIP2017)(状压DP,子集DP)

    洛谷题目传送门 Dalao的题解多数是什么模拟退火.DFS剪枝.\(O(3^nn^2)\)的状压DP之类.蒟蒻尝试着把状压改进了一下使复杂度降到\(O(3^nn)\). 考虑到每条边的贡献跟它所在的层 ...

  3. BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】

    题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...

  4. 【题解】洛谷P1541 [NOIP2010TG] 乌龟棋(类似背包的DP)

    题目来源:洛谷P1541 思路 类似背包的题 总之就是四种卡牌取的先后顺序不同导致的最终ans不同 所以我们用一个四维数组每一维分别表示第几种取了几张的最大分数 然后就是简单DP解决 代码 #incl ...

  5. 洛谷P2216: [HAOI2007]理想的正方形 单调队列优化DP

    洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一 ...

  6. 洛谷P1441 砝码称重(搜索,dfs+dp)

    洛谷P1441 砝码称重 \(n\) 的范围为 \(n \le 20\) ,\(m\) 的范围为 \(m \le 4\) . 暴力遍历每一种砝码去除情况,共有 \(n^m\) 种情况. 对于剩余砝码求 ...

  7. 洛谷P3830 随机树(SHOI2012)概率期望DP

    题意:中文题,按照题目要求的二叉树生成方式,问(1)叶平均深度 (2)树平均深度 解法:这道题看完题之后完全没头绪,无奈看题解果然不是我能想到的qwq.题解参考https://blog.csdn.ne ...

  8. 洛谷 P5044 - [IOI2018] meetings 会议(笛卡尔树+DP+线段树)

    洛谷题面传送门 一道笛卡尔树的 hot tea. 首先我们考虑一个非常 naive 的区间 DP:\(dp_{l,r}\) 表示区间 \([l,r]\) 的答案,那么我们考虑求出 \([l,r]\) ...

  9. 洛谷 P4910 帕秋莉的手环 矩阵乘法+快速幂详解

    矩阵快速幂解法: 这是一个类似斐波那契数列的矩乘快速幂,所以推荐大家先做一下下列题目:(会了,差不多就是多倍经验题了) 注:如果你不会矩阵乘法,可以了解一下P3390的题解 P1939 [模板]矩阵加 ...

随机推荐

  1. Oracle中TIMESTAMP时间的显示格式

    Oracle中的TIMESTAMP数据类型很多人用的都很少,所以即使最简单的一个查询返回的结果也会搞不清楚到底这个时间是什么时间点. 例如: 27-1月 -08 12.04.35.877000 上午 ...

  2. STS 重写父类方法的操作

    本来这种东西真的没什么好写的,但是很多时候真的是要用到的,不知道的话自己手动敲,会累死人的.所以记录在这里,自己的笔记,有需要的赶紧拿去,省的手动录入那么辛苦. 在代码窗口点击右键,依次选择“Sour ...

  3. linux软链接

    这是linux中一个非常重要的命令,他的功能是为某一个文件在另一个位置建立一个同步的链接,这个命令最常用的参数是-s, 具体用法是: ln -s 源文件 目标文件 当我们需要在不同的目录,用到相同的文 ...

  4. C# 5.0 新特性之异步方法(AM)

    Ø  前言 C# Asynchronous Programming(异步编程)有几种实现方式,其中 Asynchronous Method(异步方法)就是其中的一种.异步方法是 C#5.0 才有的新特 ...

  5. sitecore 如何创建一个渠道分类

    您可以通过渠道跟踪联系人与您的品牌的所有互动.您可以将渠道与广告系列活动相关联,以便跟踪联系人与您的品牌互动的方式.通过比较各个渠道的目标转化率,您可以了解哪些渠道可以带来更好的联系参与度.您可以在体 ...

  6. 使用 jQuery.AutoComplete 让文本框自动完成

    直接贴代码了. @section headSection { <script type="text/javascript"> $(document).ready(fun ...

  7. JDK1.8新特性——Optional类

    JDK1.8新特性——Optional类 摘要:本文主要学习了JDK1.8新增加的Optional类. 部分内容来自以下博客: https://www.cnblogs.com/1ning/p/9140 ...

  8. IO流总结---- 字节流 ,字符流, 序列化 ,数据操作流,打印流 , Properties 集合

    笔记内容: 什么是流 字节流 字符流 序列化 数据操作流(操作基本数据类型的流)DataInputStream 打印流 Properties 集合 什么是流: 流是个抽象的概念,是对输入输出设备的抽象 ...

  9. 微信小程序入门小结

  10. JS打开url的几种方法

    在新标签页中打开 window.open(loginurl_withaccout, "_blank"); 下图中根据后台返回的url以及用户名密码字段,以及用户名密码动态生成了带账 ...