【题解】薇尔莉特的打字机
2020-10-14 19:41
197 查看
题目地址:here
首先,这题需要处理字符串,我们用 trie分析
先忽略删除操作
拿样例 1 举个例子:
首先把最开始的字符串插入到树中
然后薇尔莉特打了一个字符 A
此时可以插入或者是不插入,就会有这样的情况:
不插入时,之前插入进去的字符均可以作为字符串的结尾
假设之前插入了 x个字母,每一个字母都可以作为串的结尾
现在插入这个字符,总数似乎又增加了 x个
继续看样例 1,此时薇尔莉特又打了一个字符 A
此时把它插入树中,就是这样:
此时能作为串的结尾的数仍然只有 A,重复了
所以如果新产生的可以作为结尾的节点
那么没有可以作为结尾的节点和这个节点相同
可能说的有点绕,举个例子:
假如 A已经存在于这棵树中并且可以作为结尾
那么再插入一个 A不能增加可以作为结尾节点的数量
令 ans表示插入之前可以作为结尾节点的节点数量
新插入的字符为 x
fi表示已经有第 i种字符的可以作为结尾节点的总数
我们可以算出现在的 ans=之前的 ans×2-fch,fch=原来的 ans
接下来是删除部分
此时我们已经插入了这几个节点:
删除的过程其实就是去掉当前节点往上跳的过程
比如说删除当前的 A之后就是这样:
删除了这个节点往上跳,上面的节点一定是可以作为结尾节点的节点
所以此时新产生的结果只有 1,加 1 即可
模拟 trie的操作,直接递推就好了
PS:道路我都懂,可是为什么模数是这么奇怪的数(可能是我太菜了,还不懂什么意思)
AC代码:
#include <bits/stdc++.h> using namespace std; const int mod = 19260817; int n, m; int f[100]; char s[5000002]; int main() { cin >> n >> m; scanf("%s", s + 1); char ch; int ans = 1; while (m--) { cin >> ch; if (ch == 'u') { //删除操作 if (!n) continue; //没有可以删除的了 else { ans = (ans + 1) % mod; //+1 f[s - 'A'] = (f[s - 'A'] + 1) % mod; //+1 --n; //删除节点往上跳 } } else { int tmp = f[ch - 'A']; //暂时保存 f[ch - 'A'] = ans; //赋值 ans = ((ans + ans - tmp) % mod + mod) % mod; //算 ans } } cout << ans; return 0; }
相关文章推荐
- 网页打字机效果,用于新闻标题.数据库动态.
- 快速技巧:创建一个打字机文本效果类
- javascript游戏开发之《三国志曹操传》零部件开发(三)情景对话中仿打字机输出文字
- js实现打字机效果---Day06
- noi 2011 阿狸的打字机
- MWeb 1.5 发布!增加打字机滚动模式、发布到 Evernote、印象笔记、Wordpress.com、Blogger、编辑器内代码块语法高亮
- Html5添加轻量级响应式打字机特效插件教程
- BZOJ2434 [Noi2011]阿狸的打字机
- bzoj2434【NOI2011】阿狸的打字机
- 高级打字机
- 打字机效果
- bzoj 2434 阿狸的打字机 fail树的性质
- BZOJ 2434: [Noi2011]阿狸的打字机
- [BZOJ]2434: [Noi2011]阿狸的打字机
- NOI2011 阿狸的打字机
- 文字打字机效果,可换字体样式
- bzoj2434 [Noi2011]阿狸的打字机 ( AC自动机 & fail树 + 树状数组 + dfs序 )
- JS文字打字机效果
- CocosCreator实现文字逐个出现的打字机效果
- Javascrpit特效之打字机效果