[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名选手与上一轮胜利的选手决斗,最后 ...
随机推荐
- Windows内存管理(1)--分配内核内存 和 使用链表
1. 分配内核内存 Windows驱动程序使用的内存资源非常珍贵,分配内存时要尽量节约.和应用程序一样,局部变量是存放在栈空间中的.但栈空间不会像应用程序那么大,所以驱动程序不适合递归调用或 ...
- 剑指offer——07用两个栈实现队列
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题解: 有两个栈,stack1和stack2 push只在stack1上操作,pop只在stack2 ...
- 利用Python,方便局域网内上传下载文件
因为一直在用windows系统,最近需要用到linux的服务器,两个电脑之间总是需要来回拷贝文件 这样使得很繁琐,之前一直在用Python,开启一个简单的服务器,可以在另外一台同一局域网下的电脑,在线 ...
- 将excel表格或csv转换为Shapefile文件
读取csv转为shp 构造读取csv函数 def read_csv(fp): ret = [] with open(fp, 'rb') as f: for line in f: ret.append( ...
- C++数据类型之字符串类型&布尔类型&数据的输入
字符串型 **作用**:用于表示一串字符 **两种风格** 1. **C风格字符串**: char 变量名 [ ] = "字符串值" 2.**C++风格字符串**: stri ...
- <Django>博客项目
0.项目的通用流程 项目立项 需求分析 原型 前端 页面设计 UI及交互实现 后端 架构设计 数据库设计 代码模板实现 单元测试 网站整合 功能及集成测试 网站发布 1.BBS项目需求分析 需要哪些表 ...
- HTML样式链接到外部样式表
w3cschool链接:http://www.w3school.com.cn/html/html_css.asp <html> <head><link rel=" ...
- CSIC_716_20191118【常用模块的用法 Json、pickle、collections、openpyxl】
序列化模块 序列化:将python或其他语言中的数据类型,转变成字符串类型. python中的八大数据类型回顾:int float str list tuple dict set bool 反序列化: ...
- leetcood学习笔记-82-删除排序链表中的重复元素二
题目描述: 方法一: class Solution(object): def deleteDuplicates(self, head): """ :type head: ...
- Altera: set pin locations using tcl
1, compile the project; 2, store current tcl settings: Project –> Generate Tcl File from Project- ...
