[JZOJ4673] 【NOIP2016提高A组模拟7.20】LCS again
题目
描述
题目大意
给你一个字符串和字符的取值范围,问和这个字符串的最长公共子串的长度为N−1N-1N−1的串的个数、
思考历程
一看就知道这是一个神仙题。
思考了一会儿,觉得AC是没有希望的了。
于是我的目标渐渐地降下来,最终,目标变成了如何才能拿分。
这似乎是一道连拿分都不容易的题目!
于是我想过各种方法,什么DP之类的,但是都没有想出来。
于是这题就愉快地没有分了。
比赛后我问同学怎么拿分的。
他说用set判重。
我恨不得喷出一口老血!
正解
题解的DP方法我还不清楚·,就先说说另一个方法。
显然要再原来的字符串中删去一个字符,然后从某个位置加入另一个字符。
不考虑重复,单纯地想一想:从某个位置删去一个字符,再到其它地方插入的方案数。
在删除这个字符之后的空隙数为nnn,可以放的字符种类为mmm,所以是nmnmnm种方案。
但这当然会有重复。
将字符插入到某个位置旁边的时候,如果这个位置上的字符和它一样,那么插在左边和右边是等价的,也就是重复了。
这样算就有n−1n-1n−1个重复,减去。由于先前的位置不能插入一样的字符,就再减111。
综上,方案数应该是n(m−1)n(m-1)n(m−1)
再考虑更多重复的情况。
可以将原字符串划分成许多块,每块是连续的相同的字符。
我们发现删去块中的每个字符都是等价的,所以我们只需要对于每个块加上n(m−1)n(m-1)n(m−1)的贡献、
难道这就结束了吗?不,其实还有:
举个例子,ab或ababab。
我们发现出现子串交替的时候,就会出现一些重复。
在程序实现的时候,其实可以维护末尾为i−2i-2i−2和iii的最长公共子串的长度,这个长度加一就是iii这个位置要减去的贡献。
似乎也就这两种情况了,我不会证明还有没有别的情况。
这种东西在比赛时是极难推出来的,我们姑且将它们算作找规律罢……
代码
using namespace std;
#include <cstdio>
int n,m;
char str[100010];
int main(){
scanf("%d%d%s",&n,&m,str+1);
long long ans=n*(m-1),len=0;
for (int i=2;i<=n;++i){
len=(str[i-2]==str[i]?len+1:0);
if (str[i-1]!=str[i])
ans+=n*(m-1)-len-1;
}
printf("%lld\n",ans);
return 0;
}
总结
比赛时一定要学会找规律……
[JZOJ4673] 【NOIP2016提高A组模拟7.20】LCS again的更多相关文章
- JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数
4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms Memory Limits: 262144 KB Detailed ...
- 【NOIP2016提高A组模拟9.14】数列编辑器
题目 分析 比赛上,没有注意到询问只询问光标前面,于是只打了个暴力. 因为询问只询问光标前面,首先,当光标向后每移动到一个位置,顺便将这个位置的前缀和,和最大前缀和求出来. 总之,模拟 #includ ...
- 【NOIP2016提高A组模拟9.24】总结
第一题纯模拟,结果那个出题人脑子似乎进水了,空间限制开了1G!!! 导致我捉摸了半天为什么空间要开那么大,最后只能得出上面的结论. 第二题是个矩阵快速幂,比赛上我没把递推式求出来,但是根据各种乱搞,得 ...
- 【NOIP2016提高A组模拟9.24】我的快乐时代
题目 分析 虽然我们很难求出\(\sum_{i=n}^mjoy(i)\), 但是我们可以分别求出\(\sum_{i=1}^mjoy(i)\)和\(\sum_{i=1}^{n-1}joy(i)\),相减 ...
- NOIP2016提高A组模拟9.17总结
第一题,典型的隔板问题, 但是我忘记隔板问题怎么打,一开始在花了1小时,还是没想出来,果断弃疗, 最后的40分钟,我打完了第二题,接着又用了20分钟推敲出一种极其猥琐的式子来代替,可惜预处理的阶乘忘记 ...
- 【NOIP2016提高A组模拟9.9】总结
第一题,题面很不错,正解是分治,不过用ljj水法也可以轻松的所过去. 第二题,本来以为是个有向无环图, 结果搞了半天才发现,事实并不是这样的,于是暂时弃疗, 接着在最后的40分中,某人大喊:哦原来是t ...
- 【NOIP2016提高A组模拟8.17】(雅礼联考day1)总结
考的还ok,暴力分很多,但有点意外的错误. 第一题找规律的题目,推了好久.100分 第二题dp,没想到. 第三题树状数组.比赛上打了个分段,准备拿60分,因为时间不够,没有对拍,其中有分段的20分莫名 ...
- 【NOIP2016提高A组模拟8.17】(雅礼联考day1)Binary
题目 分析 首先每个数对\(2^i\)取模.也就是把每个数的第i位以后删去. 把它们放进树状数组里面. 那么当查询操作, 答案就位于区间\([2^i-x,2^{i-1}-1-x]\)中,直接查询就可以 ...
- 【NOIP2016提高A组模拟7.17】锦标赛
题目 403机房最近决定举行一场锦标赛.锦标赛共有N个人参加,共进行N-1轮.第一轮随机挑选两名选手进行决斗,胜者进入下一轮的比赛,第二轮到第N-1轮再每轮随机挑选1名选手与上一轮胜利的选手决斗,最后 ...
随机推荐
- C++之引用与符号“&”
一.&的意思: 1.取地址符,这时候它用于数据的前面,比如int a=&b; 2.C++里还使用&作为引用符,如果你确认程序是标准的C而非C++的话,那么可以排除是引用了.引用 ...
- pycharm 参数、快捷键、调试模式
PyCharm参数.快捷键.调试模式 PyCharm设置参数 在运行Python脚本时,会经常遇到需要传入额外的参数来运行脚本. 例如下脚本1: #!/usr/bin/env python2 # *. ...
- RoadFlowCore 解决方案介绍及开发概述
RoadFlow解决方案如下: RoadFlow.Business:业务层 RoadFlow.Integrate:组织机构获取层(如果你系统要使用第三方组织架构的时候修改这里面的方法即可) RoadF ...
- 初学hibernate的心得体会
在初步学习了hibernate之后,使我明白了hibernate是一个怎样的软件.hibernate是一个比较独立的框架,它不需要太多其他软件的支持.hibernate是一个开放源代码的关系映射框架, ...
- palindrome 回文 /// Manacher算法
判断最长不连续回文 #include <bits/stdc++.h> using namespace std; int main() { ]; while(gets(ch)) { ],an ...
- 面试系列38 分库分表之后,id主键如何处理?
(1)数据库自增id 这个就是说你的系统里每次得到一个id,都是往一个库的一个表里插入一条没什么业务含义的数据,然后获取一个数据库自增的一个id.拿到这个id之后再往对应的分库分表里去写入. 这个方案 ...
- Jmeter----函数助手参数化
要填写开始日期和结束日期和赋值的变量名
- Java超简明入门学习笔记(一)
Java编程思想第4版学习笔记(一) 第二章 一切都是对象(Hello World) 这个笔记本主要记录了我在学习Java编程思想(第4版,中文版)的过程中遇到的重难点及其分析.主要 ...
- Word 多级节标题设置和图表章节号自动生成
写文章的时候,正文.图表.节标题,通过“样式”可以进行统一设置,这里我记录了几点小技巧: 1.多级标题如何设置 假设我要设置三级标题,下面以图的形式记录方式: 设置完之后,应用即可. 章节设定之后,可 ...
- centos6.5离线安装pandas
由于笔记本跑不动很多大赛的数据,遂转至申请的虚拟机(centos6.5)中,奈何学校的虚拟机没网,就开始了离线安装pandas的道路,当中有踩了好些坑,于是便产生了这篇文章~ 首先,自带的python ...
