题目传送门(内部题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. P1622释放囚犯

    这是一道绿题,是一道让人想用贪心但却是区间DP的题目,难倒了我这个蒟蒻. 这个题其实仔细观察是类似于石子合并的!合并石子的代价便是肉的数量,求最小代价.所以我们设dp[i][j]为释放第i个到第j个所 ...

  2. Scrapy 教程(七)-架构与中间件

    Scrapy 使用 Twisted 这个异步框架来处理网络通信,架构清晰,并且包含了各种中间件接口,可以灵活的完成各种需求. Scrapy 架构 其实之前的教程都有涉及,这里再做个系统介绍 Engin ...

  3. ajax实现异步请求模态登陆

    ajax实现模态登陆 j2ee课程项目实现   Ajax 即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML),是指一种创 ...

  4. 小程序中页面兼容h5标签的解析

    有时候当小程序向后台拿数据是一篇html标签的文章时,把它放进小程序会发现很多标签就不兼容,如果要一个个改又很麻烦,有没有方法可以很快地兼容html标签呢? 有个工具可以做到:wxParse 下载了它 ...

  5. C语言双向链表讲解

    一.双向链表的概念 双向链表基于单链表.单链表是单向的,有一个头结点,一个尾结点,要访问任何结点,都必须知道头结点,不能逆着进行.而双链表添加了一个指针域,通过两个指针域,分别指向结点的前结点和后结点 ...

  6. 免费申请 QQ 免费靓号

    打开网址:https://ssl.zc.qq.com/v3/index-chs.html?type=3 说明:靓号一般分为 9位靓号 or 带有寓意的号码 激活规则:获取的"靓号" ...

  7. 关于session的记录

    在做DRP项目中的修改密码功能时,在JSP中先获取了之前登陆时设置的session中的用户账号,在调试的时候一直只是刷新页面,而没有重启页面,导致AJAX一直传输到相应的servlet失败,出现404 ...

  8. Thinkphp5 自定义分页样式显示页码和数量

    Thinkphp5 自带的分页比较简单,本文通过修改Bootstrap类自定义显示分页的页码和数量 一.修改完成后如下图显示 二.修改Bootstrap代码: 1.为了不改动Bootstrap.php ...

  9. Educational Codeforces Round 68 (Rated for Div. 2) C. From S To T (字符串处理)

    C. From S To T time limit per test1 second memory limit per test256 megabytes inputstandard input ou ...

  10. Centos7.5 mysql5.7.26二进制安装方式

    1    yum安装所需相关依赖包. yum -y install gcc-c++ yum -y install zlib zlib-devel pcre pcre-devel yum -y inst ...