bzoj 3670 [Noi2014]动物园

【bzoj3670】 [NOI2014]动物园 这道题我WA了好几遍,很平常的对于KMP的应用,一开始还T了,后来发现自己好像写了假的KMP,改了一下就A掉了,因为递归的话可能被卡成n^2,所以要递推出解,一种很巧妙的写法就可以直接递推出解(其实KMP本来就是这么写的。。)#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorith 阅读详情

                                        bzoj 3670 动物园

Description

近日,园长发现动物园中好吃懒做的动物越来越多了。例如企鹅,只会卖萌向游客要吃的。为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法。

某天,园长给动物们讲解KMP算法。

园长:“对于一个字符串S,它的长度为L。我们可以在O(L)的时间内,求出一个名为next的数组。有谁预习了next数组的含义吗?”

熊猫:“对于字符串S的前i个字符构成的子串,既是它的后缀又是它的前缀的字符串中(它本身除外),最长的长度记作next[i]。”

园长:“非常好!那你能举个例子吗?”

熊猫:“例S为abcababc,则next[5]=2。因为S的前5个字符为abcab,ab既是它的后缀又是它的前缀,并且找不到一个更长的字符串满足这个性质。同理,还可得出next[1] = next[2] = next[3] = 0,next[4] = next[6] = 1,next[7] = 2,next[8] = 3。”

园长表扬了认真预习的熊猫同学。随后,他详细讲解了如何在O(L)的时间内求出next数组。

下课前,园长提出了一个问题:“KMP算法只能求出next数组。我现在希望求出一个更强大num数组一一对于字符串S的前i个字符构成的子串,既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,将这种字符串的数量记作num[i]。例如S为aaaaa,则num[4] = 2。这是因为S的前4个字符为aaaa,其中a和aa都满足性质‘既是后缀又是前缀’,同时保证这个后缀与这个前缀不重叠。而aaa虽然满足性质‘既是后缀又是前缀’,但遗憾的是这个后缀与这个前缀重叠了,所以不能计算在内。同理,num[1] = 0,num[2] = num[3] = 1,num[5] = 2。”

最后,园长给出了奖励条件,第一个做对的同学奖励巧克力一盒。听了这句话,睡了一节课的企鹅立刻就醒过来了!但企鹅并不会做这道题,于是向参观动物园的你寻求帮助。你能否帮助企鹅写一个程序求出num数组呢?

特别地,为了避免大量的输出,你不需要输出num[i]分别是多少,你只需要输出对1,000,000,007取模的结果即可。

Input

第1行仅包含一个正整数n ,表示测试数据的组数。随后n行,每行描述一组测试数据。每组测试数据仅含有一个字符串S,S的定义详见题目描述。数据保证S 中仅含小写字母。输入文件中不会包含多余的空行,行末不会存在多余的空格。

 

Output

包含 n 行,每行描述一组测试数据的答案,答案的顺序应与输入数据的顺序保持一致。对于每组测试数据,仅需要输出一个整数,表示这组测试数据的答案对 1,000,000,007 取模的结果。输出文件中不应包含多余的空行。

Sample Input

3
aaaaa
ab
abcababc





Sample Output

36
1
32

HINT

n≤5,L≤1,000,000


用KMP 思想做
#include<cstdio>
#include<cstring>
#define MAXN 1000010
#define MOD 1000000007
using namespace std;
typedef long long ll;
char s[MAXN];
ll next[MAXN],cnt[MAXN],ans;
int n;
void KMP()
{
    int i,j=0;
    cnt[1]=1;
    for( i=2;s[i];i++)
    {
        while(j&&s[j+1]!=s[i])  j=next[j];
        if(s[j+1]==s[i])  ++j;
        next[i]=j;
        cnt[i]=cnt[j]+1;
    }
     j=0;ans=1;
    for(i=1;s[i];i++)
    {
        while(j&&s[j+1]!=s[i])  j=next[j];
        if(s[j+1]==s[i])  ++j;
        while((j<<1)>i)  j=next[j];
        ans*=cnt[j]+1;
        ans%=MOD;
    }
}
int main()
{
    scanf("%d",&n);
     for(int i=1;i<=n;i++)
     {
          scanf("%s",s+1);
          KMP();
          printf("%lld\n",ans);
    }
    return 0;
}




Mission Planner连接Autopilot保姆级教程:从USB到无线全搞定 本文提供Mission Planner连接Autopilot的全面指南,涵盖USB直连、无线数传、蓝牙适配等多种连接方案。详细讲解驱动安装、波特率匹配、性能优化等关键步骤,并分享多链路冗余配置与故障转移的高阶技巧,助你快速解决连接问题。 阅读详情

相关推荐

微机原理与接口技术第六版周荷琴课后习题答案及解析(期末重点)

第二章 1.8086/8088CPU可直接寻址多少个内存(字节)单元?多少个I/O端口?它们的外部数据总线各有多少根? 8086/8088CPU使用的是20位地址总线,因此可以直接寻址2的20次方个内存单元(即1,048,576),每个单元大小为1字节,因此可以直接寻址2的20次方个字节的内存。 8086/8088CPU有64K个I/O端口,每个端口占用1字节的地址空间,因此可以直接寻址6...

Wmicheng的博客 1万+

最短时间【题解】

dp入门

m0_57344422的博客 1104

GEOPHYSICS 投稿避坑指南:从格式规范到双盲评审的实战解析

本文详细解析了GEOPHYSICS期刊投稿的全流程避坑指南,从格式规范、数据声明到双盲评审的实战策略。特别强调了数学公式排版、图表制作标准以及投稿系统的隐藏关卡,帮助作者避免常见错误,提升投稿成功率。

weixin_30606461的博客 236

【51Nod1277】字符串中的最大值

Description一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd。 给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值。 例如:S = “abababa” 所有的前缀如下:“a”, 长度与出现次数的乘积 1 * 4 = 4, “ab”,长度与出现次数的乘积 2 * 3 = 6, “aba”, 长度与出现次数的

Facico的博客 1307

42页Claude 3技术报告解读(Opus, Sonnet, Haiku)

在Claude 3模型中,增加了一个额外的原则到Claude的宪法中,以鼓励尊重残疾人权利,这一原则源自对集体宪法AI的研究。Claude 3模型的训练基于专有的混合数据集,包括截至2023年8月互联网上公开可用的信息,以及第三方提供的非公开数据、数据标注服务和付费承包商提供的数据,还有内部生成的数据。这些初始响应通常包含有害和有毒的内容。Claude 3模型家族在推理、编码和问答任务上展现出卓越的性能,特别是在行业标准基准测试中取得了显著的提升,证明了其在处理复杂问题和提供准确答案方面的能力。

具身机器人和通用AI 2435

多组学联合高级Mantel-test热图

对应的是「metabo」中物质间的相关性热图,单元格色块颜色表示相关系数大小,橙色表示+相关,绿色表示-相关;单元格内的数值表示相关性值大小,星号表示显著性。双组学(微生物组/ 转录组/代谢组等两两组合)关联分析,可视化组学特征间的关联显著性、强度及相关方向。表示<trans>与<metabo>中物质的Mantel test结果。表示整体相关的系数,连线颜色表示相关系数的显著性检验结果。宿主-微生物互作、疾病多组学机制、环境-生物多组学关联。为物质名称,不允许存在空值、重复值。

多组・学・多组学 362

【NOI2014】动物园

近日,园长发现动物园中好吃懒做的动物越来越多了。例如企鹅,只会卖萌向游客要吃的。为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法。 某天,园长给动物们讲解 KMP 算法。 园长:“对于一个字符串 S,它的长度为 L。我们可以在 O(L)的时间内,求出一个名为 next 的数组。有谁预习了 next 数组的含义吗?” 熊猫:“对于字符

chen1352 542

【GameFramework框架】一、框架介绍

这是GameFramework框架教程的第一篇,但是博主不准备直接就讲GameFramework框架。【GameFramework框架】二、GameFramework框架介绍了。框架(Framework)通常被理解为一种基础要素的集合,它们用于承载系统的必要功能。约束性:框架定义了解决特定问题的边界,并将相关的软件组件约束在这个范围内,以保持框架的内聚性和解决问题的专注性。支撑性:框架本身不直接解决问题,而是提供一个基础的支撑结构,使得在其上构建的解决方案更为灵活和高效。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1万+

(KMP)[NOI2014] 动物园解析

(KMP)[NOI2014] 动物园解析 以前oi的时候没好好学的算法,大学再学一遍,收获还是蛮大的 本题要求num[i]+1的乘积,其中num[i]是对于一个字符串的第i个前缀所具有的长度不大于i/2的(前缀函数求的那种)前缀的个数。 1 当然先kmp,发现可以暴力跳转,也就是kmp求得 pi[i](或者称之为next[i])后暴力枚举pi[pi[i]-1],直到长度满足要求,复杂度为O(n2)。 发现这个枚举很眼熟,可以通过倍增优化,时间复杂度降至O(nlgn)。 2 上面得到的是最大的满足

vermouth_1412的博客 609

[特殊字符] 从零构建携程/飞猪机票价格爬虫:Python异步抓取与反爬对抗实战

在出行决策、竞品分析、价格预测模型训练等场景中,稳定获取携程(Ctrip)和飞猪(Fliggy)的实时机票价格波动数据是刚需。然而,这两大平台均部署了业界顶尖的反爬体系——包括但不限于:动态请求签名(SignToken设备指纹采集(UACanvasWebGL接口参数加密(X-Sign_abtestcookie混淆)频率限制与 IP 封禁(滑动窗口 + 行为检测)目录前言:为什么需要自建机票价格爬虫?一、技术选型与项目架构1.1 核心技术栈1.2 系统架构图(文字描述)1.3 法律与道德声明。

2201_76125261的博客 337

计算图像哈希SHA-512

上述需要将lena.jpg放在当前目录下。

计算机视觉之光 961

#5. 【NOI2014】动物园

%miaom

wamach的博客 408

菜鸟哥玩蓝牙Ble4.0系列 ESP32初玩篇③ Beacon —— 广播应用,室内定位,内容推送

文章目录1、前言1.1 什么叫做Beacon?1.2 Beacon使用场景1.3 Beacon协议落地实现2、ESP32 Beacon案例3、Beacon核心库 —— BLEBeacon、BLEEddystoneTLM、BLEEddystoneURL3.1 BLEBeacon3.2 BLEEddystoneTLM3.3 BLEEddystoneURL 授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石。。。

单片机菜鸟哥的博客 2万+

bzoj3670[Noi2014]动物园

bzoj3670[Noi2014]动物园 题意: 对于字符串S的前i个字符构成的子串,既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,将这种字符串的数量记作num[i]。给出字符串S求所有num[i]+1的乘积模1000000007。字符串长度≤1000000 题解: 先求一遍fail函数,得到数组记为next1,然后再求next2数组,表示满足next1[j]*2≤i的...

anheku1562的博客 170

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

bzoj3670 [Noi2014]动物园 kmp

bzoj3670 [Noi2014]动物园 kmp 题意:长度<=100w的字符串 num[i]表示前i个字符组成的字符串中既是前缀又是后缀且前缀后缀不重叠的子字符串个数 求%(1e9+7) 题解:开始看错题了……以为num[i]是既是前缀又是后缀且前缀后缀不重叠的最长子字符串长度……翻题解没弄懂他们的方法……自己yy一个没敢写呢仔细一看题卧槽……这个事情告诉我们仔细看样例啊…… num[i]

yxr0105 642

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【bzoj3670】[Noi2014]动物园

3670: [Noi2014]动物园 Time Limit:10 SecMemory Limit:512 MBSubmit:2080Solved:1107[Submit][Status][Discuss] Description 近日,园长发现动物园中好吃懒做的动物越来越多了。例如企鹅,只会卖萌向游客要吃的。为了整治动物园的不良风气,让动物们凭自己的真才实学...

anzhi7214的博客 111

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

bzoj3670【NOI2014】动物园

KMP

AaronPolaris 4395

BZOJ3670 [Noi2014]动物园

[Solution] It

_laekov 2199

[kmp] bzoj3670: [Noi2014]动物园

bzoj3670: [Noi2014]动物园:https://www.lydsy.com/JudgeOnline/problem.php?id=3670 求p #include &lt;cstdio&gt; #include &lt;cstring&gt; #include &lt;algorithm&gt; using namespace std; char a[1100000]; int ...

kkkGIGi_qtt 210

【KMP】[Noi2014] bzoj3670 动物园

题目点这里 记得第一次看这道题。。林伟平在讲课。。。然后我看到那句企鹅只会卖萌要吃的。。就笑了出来。。。于是…… 感觉noi2014的题很考语文水平啊。。之前day1前两题我题全都看错orz。。第三题根本不造在做啥。。。。这道题我研究了很久才知道它是要求什么。。。 对于每个 0 然后。。。题目都告诉是KMP了 所以这题就是KMP乱搞了…… KMP是一个fix指针

每天心塞一点点 2306

bzoj3670动物园【NOI2014】

kmp中next数组运用

YHaX的博客 1619

bzoj 3670 [NOI2014]动物园

3670: [Noi2014]动物园 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2032  Solved: 1077[Submit][Status][Discuss] Description 近日,园长发现动物园中好吃懒做的动物越来越多了。例如企鹅,只会卖萌向游客要吃的。为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,

SBS的博客 311

BZOJ3670 [NOI2014]动物园 [KMP]

BZOJ3670 [NOI2014]动物园 [KMP] 题目描述 题目传送门 题解 这道题主要利用了Fail数组(本题中的next数组)的性质。 熊猫:“对于字符串S的前i个字符构成的子串,既是它的后缀又是它的前缀的字符串中(它本身除外),最长的长度记作next[i]。” 设num[i]num[i]num[i]表示字符串的前iii位中前缀和后缀相等的字符串个数(没有“...

AnnieL 311

BZOJ 3670 NOI2014 动物园 KMP算法

题意: 给定一个长为L的字符串(L 求Π(num[i]+1)%1000000007 这就是KMP算法的一个变形。。。首先求出next数组,顺便求出cnt数组,代表长度为i的前缀经过几次fix=next[fix]会得到0,然后重新匹配一次,这次注意当fix*2>i的时候令fix=next[fix]即可 这题有坑 切忌用num数组代替next 此外勿忘开long long 这题就水过去了。

世界 3226

【NOI2014】BZOJ3670动物园题解(KMP算法)

题目:BZOJ3670. 题目大意:给定一个字符串,求这个字符串每一个前缀S[1..i]S[1..i]S[1..i]的既是前缀又是后缀且这两个前后缀不能重叠的子串的数量num[i]num[i]num[i],并输出所有(num[i]+1)(num[i]+1)(num[i]+1)的乘积. 这道题是道语文题,题面又臭又长而且num[i]num[i]num[i]的定义是数量不是最长长度,在题面理解上直接是...

hzk_cpp的博客 373
上一篇: bzoj 1046: [HAOI2007]上升序列 LIS
下一篇: bzoj 1911 [Apio2010]特别行动队斜率优化+DP
DJS_K_D
博客等级 码龄12年 2粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值