题目传送门(内部题75)


输入格式

  输入文件$ccx.in$
  每个输入文件包含多组测试数据。输入文件的第一行为一个整数$T$,表示数据组数。接下来$T$行,每行表示一组测试数据
  每行一开始,两个空格隔开的数字$n,m$,含义见【题目描述】。之后是一个长度为$m$的字符串。


输出格式

  $T$行,每行一个整数表示答案。


样例

见下发文件


数据范围与提示

  对全部测试数据,$n\leqslant 10^6 ,m\leqslant 10^6 ,T\leqslant 10$,输入文件中的所有$m$之和不超过$5\times 10^6$
  第$1,2$个测试点,$m=1$
  第$3,4$个测试点,给出的字符串中只含有字母$'A'$
  第$5,6,7,8,9,10,11$个测试点,满足$n\times m\leqslant 10^6$
  第$11,12,13,14,15$个测试点,满足$m\leqslant 100$
  第$16,17,18,19,20$个测试点,无特殊限制


题解

考察对$KMP$的理解。

一般情况下就是$(n-1)\times m$。

话画图会发现当串长减去最长公共前后缀是串长的一个因子时答案就是$(n-1)\times m+nxt[n]$(这里的$nxt$数组其实就是$KMP$中的$nxt$数组,即为串的公共前后缀)。

其实用$hash$也可以。

时间复杂度:$\Theta(T\times\sum m)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

$KMP$:

#include<bits/stdc++.h>
using namespace std;
long long n,m;
char ch[2000001];
int nxt[2000001];
void KMP()
{
nxt[0]=-1;
for(int i=0;i<m;i++)
{
int j=nxt[i];
while(j!=-1&&ch[i]!=ch[j])j=nxt[j];
nxt[i+1]=++j;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&n,&m);
scanf("%s",ch);
KMP();
if(n==1)printf("%d\n",nxt[m]);
else if(!(m%(m-nxt[m])))printf("%lld\n",(n-1)*m+nxt[m]);
else printf("%lld\n",(n-1)*m);
}
return 0;
}

$hash$:

#include<bits/stdc++.h>
using namespace std;
long long n,m;
char ch[1000001];
unsigned long long mod[1000001],Hash[1000001];
int HASH()
{
mod[1]=1;
Hash[1]=ch[1]-'A'+1;
for(int i=2;i<=m;i++)
{
Hash[i]=Hash[i-1]*131+ch[i]-'A'+1;
mod[i]=mod[i-1]*131;
}
for(int i=m-2;i;i--)
if(Hash[i+1]==Hash[m]-Hash[m-i-1]*mod[i+2])return i+1;
return 1;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld",&n,&m);
scanf("%s",ch+1);
int flag=HASH();
if(n==1)printf("%d\n",flag);
else if(!(m%(m-flag)))printf("%lld\n",(n-1)*m+flag);
else printf("%lld\n",(n-1)*m);
}
return 0;
}

rp++

[CSP-S模拟测试]:串串香(KMP)的更多相关文章

  1. Android单元测试与模拟测试详解

    测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...

  2. [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)

    目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...

  3. 安装nginx python uwsgi环境 以及模拟测试

    uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...

  4. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

  5. 转 C#实现PID控制的模拟测试和曲线绘图

    C#实现PID控制的模拟测试和曲线绘图   本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...

  6. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  7. NOIP模拟测试1(2017081501)

    好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...

  8. Mock 模拟测试简介及 Mockito 使用入门

    Mock 是什么mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代 ...

  9. Mac下Jmeter快速安装与入门-模拟测试Post请求及设置Http头

    [1]去Apache官网下载 Binaries系列的最新Jmeter.gz包 [2]下载到本地之后解压缩,进入到解压之后的目录然后,找到apache-jmeter-4.0/bin/jmeter.sh ...

随机推荐

  1. Linux搜索文件

    1.7.1 使用which 查找可执行文件的绝对路径 ·只能用来查找PATH环境变量中出现的路径下的可执行文件 1.7.2 使用whereis 查找文件 ·通过预先生成的一个文件列表库查找与给出文件名 ...

  2. 期货、股指期权、ETF期权

    期货与期权: 期权是指一种合约,该合约赋予持有人在某一特定日期或该日之前的任何时间以固定价格购进或售出某种资产的权利. 期货是标准化的合约,赋予参与者在未来的某个时间点以约定好的一个价格去买入或者卖出 ...

  3. [转帖]Oracle 使用sqlnet.ora/trigger限制/允许某IP或IP段访问指定用户

    Oracle 使用sqlnet.ora/trigger限制/允许某IP或IP段访问指定用户 原创 Oracle 作者:maohaiqing0304 时间:2016-05-03 17:05:46  17 ...

  4. express接受ajax的发送post请求

    两种常用的方式: $.ajax({ type: "POST", url: '/everdayPost', // data: JSON.parse({cont:data}),注意: ...

  5. 傻傻分不清?Integer、new Integer() 和 int 的面试题

    这篇有意思: 基本概念的区分: 1.Integer 是 int 的包装类,int 则是 java 的一种基本数据类型 2.Integer 变量必须实例化后才能使用,而int变量不需要 3.Intege ...

  6. 【7.10校内test】T1高级打字机

    [题目链接luogu] 这是T1,但是是神仙T1: 对于前100%的数据很好写,直接数组模拟就可以了: (当然也有栈模拟的,据说有模拟炸了的) //50pts#include<bits/stdc ...

  7. [Bzoj1597][Usaco2008 Mar]土地购买(斜率优化)

    题目链接 因为题目说可以分组,并且是求最值,所以斜率优化应该是可以搞的,现在要想怎么排序使得相邻的数在一个组中最优. 我们按照宽$w$从小到大,高$h$从小到大排序.这时发现可以筛掉一些一定没有贡献的 ...

  8. 解决跳转出现 No input file specified.

    项目根目录中.htaccess文件修改为: <IfModule mod_rewrite.c>  Options +FollowSymlinks  RewriteEngine On Rewr ...

  9. P4556 [Vani有约会]雨天的尾巴(线段树合并+lca)

    P4556 [Vani有约会]雨天的尾巴 每个操作拆成4个进行树上差分,动态开点线段树维护每个点的操作. 离线处理完向上合并就好了 luogu倍增lca被卡了5分.....于是用rmq维护.... 常 ...

  10. ThinkPHP5微信支付扩展库(超级简单, 超级超好用!)

    ThinkPHP5微信支付最新扩展库(2017年9月24日). 我的想法很简单,就是只需要调用一个静态方法就可以完成支付,查询,退款,查账等等, 无需重复造轮子, 专注自己业务!欢迎到Github查看 ...