题目

描述

题目大意

给你一个字符串和字符的取值范围,问和这个字符串的最长公共子串的长度为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)的贡献、

难道这就结束了吗?不,其实还有:

举个例子,abababab

我们发现出现子串交替的时候,就会出现一些重复。

在程序实现的时候,其实可以维护末尾为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的更多相关文章

  1. JZOJ 4732. 【NOIP2016提高A组模拟8.23】函数

    4732. [NOIP2016提高A组模拟8.23]函数 (Standard IO) Time Limits: 1500 ms  Memory Limits: 262144 KB  Detailed ...

  2. 【NOIP2016提高A组模拟9.14】数列编辑器

    题目 分析 比赛上,没有注意到询问只询问光标前面,于是只打了个暴力. 因为询问只询问光标前面,首先,当光标向后每移动到一个位置,顺便将这个位置的前缀和,和最大前缀和求出来. 总之,模拟 #includ ...

  3. 【NOIP2016提高A组模拟9.24】总结

    第一题纯模拟,结果那个出题人脑子似乎进水了,空间限制开了1G!!! 导致我捉摸了半天为什么空间要开那么大,最后只能得出上面的结论. 第二题是个矩阵快速幂,比赛上我没把递推式求出来,但是根据各种乱搞,得 ...

  4. 【NOIP2016提高A组模拟9.24】我的快乐时代

    题目 分析 虽然我们很难求出\(\sum_{i=n}^mjoy(i)\), 但是我们可以分别求出\(\sum_{i=1}^mjoy(i)\)和\(\sum_{i=1}^{n-1}joy(i)\),相减 ...

  5. NOIP2016提高A组模拟9.17总结

    第一题,典型的隔板问题, 但是我忘记隔板问题怎么打,一开始在花了1小时,还是没想出来,果断弃疗, 最后的40分钟,我打完了第二题,接着又用了20分钟推敲出一种极其猥琐的式子来代替,可惜预处理的阶乘忘记 ...

  6. 【NOIP2016提高A组模拟9.9】总结

    第一题,题面很不错,正解是分治,不过用ljj水法也可以轻松的所过去. 第二题,本来以为是个有向无环图, 结果搞了半天才发现,事实并不是这样的,于是暂时弃疗, 接着在最后的40分中,某人大喊:哦原来是t ...

  7. 【NOIP2016提高A组模拟8.17】(雅礼联考day1)总结

    考的还ok,暴力分很多,但有点意外的错误. 第一题找规律的题目,推了好久.100分 第二题dp,没想到. 第三题树状数组.比赛上打了个分段,准备拿60分,因为时间不够,没有对拍,其中有分段的20分莫名 ...

  8. 【NOIP2016提高A组模拟8.17】(雅礼联考day1)Binary

    题目 分析 首先每个数对\(2^i\)取模.也就是把每个数的第i位以后删去. 把它们放进树状数组里面. 那么当查询操作, 答案就位于区间\([2^i-x,2^{i-1}-1-x]\)中,直接查询就可以 ...

  9. 【NOIP2016提高A组模拟7.17】锦标赛

    题目 403机房最近决定举行一场锦标赛.锦标赛共有N个人参加,共进行N-1轮.第一轮随机挑选两名选手进行决斗,胜者进入下一轮的比赛,第二轮到第N-1轮再每轮随机挑选1名选手与上一轮胜利的选手决斗,最后 ...

随机推荐

  1. 隐藏tomcat页面异常显示的版本信息

    1.正常情况下,tomcat遇到404或500会返回版本信息: 2.有时我们不需要暴露版本信息,像这样: 3.只需要修改apache-tomcat-7.0.59的lib目录下的catalina.jar ...

  2. Spring源码由浅入深系列二 类结构

    BeanFactory 上一章中,我们提过Spring的依赖注入容器是BeanFactory.BeanFactory是一个基础接口,它有一个默认实现类:DefaultListableBeanFacto ...

  3. 【python】遇到的错误

    呃.这学期在学python啦.之前虽然自学过,但都是跟着教程也没使用什么编译环境.没遇到奇奇怪怪的错误. 现在就当作一个记录贴吧. 用的编译工具是pycharm.电脑是MacBook Air 1.我在 ...

  4. 转载:ASP.NET Core 在 JSON 文件中配置依赖注入

    在以前的 ASP.NET 4+ (MVC,Web Api,Owin,SingalR等)时候,都是提供了专有的接口以供使用第三方的依赖注入组件,比如我们常用的会使用 Autofac.Untiy.Stri ...

  5. 学无止境的CSS(xHTML+CSS技巧教程资源大全)

    本文里面收集一些有关CSS的技巧.教程.工具和观点等,其中一些你也许早就运用的炉火纯青,也可能有的你听都没听说过.不管是新手还是高手,大家都继续学习吧. 一,Web 标准 要玩游戏,就得先了解规则.要 ...

  6. 使用PyCharm创建Django项目及基本配置

    https://segmentfault.com/a/1190000011576316 pycharm是个很不错的python开发工具,大大缩短了python项目的创建时间以及调试时间在使用pytho ...

  7. centos安装与配置R语言

    Linux下安装R语言 一.编译安装 由于采用编译安装,所以需要用到gcc编译环境,在编译前check文件时还会用到libXt-devel和readline-devel两个依赖,所以在编译R语言源码时 ...

  8. spark安装及配置

    windows下spark的安装与配置教程 Windows下安装spark windows下搭建spark环境出现ChangeFileModeByMask error (3): ??????????? ...

  9. 深度探索C++对象模型之第一章:关于对象之关键词所引起的差异

    ————如果不是为了努力维护与C之间的兼容性,C++远比现在简单的多. 如果一个程序员渴望学习C++,但是他却发现书中没有熟悉的struct,一定会苦恼,将这个主题包含到C++里,可以提供语言转移时的 ...

  10. [转]Nginx配置详解

    Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭借开源的力量,已经接近成熟与完善. Nginx功能丰富,可作为HTTP服务器,也可作为 ...