题目传送门(内部题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. excel导入导出(一)

    excel导入导出 依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi& ...

  2. SpringBoot项目启动时执行初始化操作

    SpringBooot中的CommandLineRunner接口会在所有Spring Beans初始化之后,SpringApplication.run()之前执行. 1.添加pom引用 <?xm ...

  3. [Git] 018 冲突在所难免,需要巧妙化解

    0. 回顾 [Git] 005 初识 Git 与 GitHub 之分支 中"4.2 情形二"的 9 提及了"解决冲突" 当时没有展开,这回详谈 我这回反其道而行 ...

  4. urllib基本库的使用

    get方法的学习 1import urllib.request 2import ssl 3#设置全局证书 4ssl._create_default_https_context = ssl._creat ...

  5. [转帖]深度解析区块链POW和POS的区别

    深度解析区块链POW和POS的区别 Proof of Work 还有Proof of Stake 之前理解程了 state ... 股权的意思 还有 delegated proof of Stake ...

  6. [HDU 3712] Fiolki (带边权并查集+启发式合并)

    [HDU 3712] Fiolki (带边权并查集+启发式合并) 题面 化学家吉丽想要配置一种神奇的药水来拯救世界. 吉丽有n种不同的液体物质,和n个药瓶(均从1到n编号).初始时,第i个瓶内装着g[ ...

  7. python UnicodeEncodeError: 'gbk' codec can't encode character ...

    使用Python写文件的时候,或者将网络数据流写入到本地文件的时候,大部分情况下会遇到:UnicodeEncodeError: 'gbk' codec can't encode character ' ...

  8. 使用vscode来代替git上传代码到仓库

    一.在上传前的注意事项 1. 要配置几个文件: (1)在根目录添加 .gitignore  文件:里面添加一些上传时需要忽略的文件 (2)在根目录添加 README.md  文件,这个用来说明项目的 ...

  9. div和span互换

    div是块级元素,它不论大小默认占一行,而且可以设置宽高以及外边距span是行内元素,它占它自身大小的位置,而且不能设置宽高以及边距同时div也可以变为span (display:inline),这样 ...

  10. 简单的物流项目实战,WPF的MVVM设计模式(一)

    新建一个WPF项目,命名为WMS 然后分别新建文件夹,Data,Models,Views,ViewModels,Services,如下图所示 然后通过NuGet安装连个Nuget包,分别为SQLite ...