题目传送门(内部题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. vscode打开SpringBoot项目

    1.使用vscode打开java项目所在文件夹 2.按ctl+~ 打开命令面板 mvn -Dmaven.test.skip=true spring-boot:run

  2. KMP字符串匹配 模板 洛谷 P3375

    KMP字符串匹配 模板 洛谷 P3375 题意 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.(如果 ...

  3. Vim实用技巧(一)

    vim 命令按键规定 标记 含义 x 按一次 x dw 按一次 d, w dap 按一次 d, a, p 同时按 和 n g<C-]> 按 g, 然后同时按 和 ] <C-=> ...

  4. tensorflow学习笔记一----------tensorflow安装

    2016年11月30日,tensorflow(https://www.tensorflow.org/)更新了0.12版本,这标志着我们终于可以在windows下使用tensorflow了(但是还是推荐 ...

  5. 数学: HDU1098 Ignatius's puzzle

    Ignatius's puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  6. ssm中web配置各框架的配置文件路径方式

    一.在web文件中配置 使用逗号隔开 二.在applicationContext.xml文件中配置或引用 以下是引用方式 注: <import />标签要放在所有bean配置的最前面.  

  7. java上传文件-大文件以二进制保存到数据库

    转自:https://blog.csdn.net/qq_29631069/article/details/70054201 1 一.创建表 oracle: create table baoxianda ...

  8. SPSS25 下载安装和激活

    目录 1. 其他版本 2. 安装步骤 3. 下载地址 1. 其他版本 参考:https://www.cnblogs.com/coco56/p/11648399.html 2. 安装步骤 打开安装包 下 ...

  9. STM32 总线

    AHB,是Advanced High performance Bus的缩写,译作高级高性能总线,这是一种“系统总线”.AHB主要用于高性能模块(如CPU.DMA和DSP等)之间的连接.AHB 系统由主 ...

  10. 【转】Linux下的磁盘分区方法

    转自:https://www.cnblogs.com/lbole/p/8904298.html 一.硬盘接口类型 硬盘的接口主要有IDE.SATA.SCSI .SAS和光纤通道等五种类型.其中IDE和 ...