bzoj3670动物园【NOI2014】

2023-11-07 21:48
文章标签 动物园 bzoj3670 noi2014

本文主要是介绍bzoj3670动物园【NOI2014】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

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

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

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

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

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

熊猫:“例S为abcababc,则next[5]=2。因为S的前5个字符为abcabab既是它的后缀又是它的前缀,并且找不到一个更长的字符串满足这个性质。同理,还可得出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]。例如Saaaaa,则num[4] = 2。这是因为S的前4个字符为aaaa,其中aaa都满足性质‘既是后缀又是前缀’,同时保证这个后缀与这个前缀不重叠。而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 取模的结果。输出文件中不应包含多余的空行。


先用kmp求出最大匹配,顺便记下该位置的前后缀匹配个数。

求解时,对每个位置一直求next,直到满足前缀长度不超过一半。

#include<cstdio>
#include<cstring>
char s[1000010];
int cnt[1000010],next[1000010];
long long ans;
const long long md=1000000007;
int main()
{int i,j,k,l,m,n,p,q,x,y,z,T;scanf("%d",&T);while (T--){memset(cnt,0,sizeof(cnt));memset(next,0,sizeof(next));scanf("%s",s+1);l=strlen(s+1);cnt[1]=1;for (i=2,j=0;i<=l;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;}ans=1;for (i=2,j=0;i<=l;i++){while (j&&s[j+1]!=s[i]) j=next[j];if (s[j+1]==s[i]) j++;while (j*2>i) j=next[j];ans*=cnt[j]+1;ans%=md;}printf("%lld\n",ans);}
}


这篇关于bzoj3670动物园【NOI2014】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/366469

相关文章

解析《动物园规则怪谈》【逻辑】

鉴赏《动物园规则怪谈》【逻辑】 前言版权推荐鉴赏《动物园规则怪谈》推理游客正方“它”方其他物品 不同规则或纸条的对比联系出现的地方及联系游客入园历程:被“它”污染的过程鉴赏升华 最后 前言 2024-5-31 13:05:38 以下内容源自《【逻辑】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN@日星月云 博客主页是h

【NOI2014模拟6.20】慎二的随机数列

Description 间桐慎二是间桐家著名的废柴,有一天,他在学校随机了一组随机数列,准备使用他那强大的人工智能求出其最长上升子序列,但是天有不测风云,人有旦夕祸福,柳洞一成路过时把间桐慎二的水杯打翻了…… 现在给你一个长度为n 的整数序列,其中有一些数已经模糊不清了,现在请你任意确定这些整数的值,使得最长上升子序列最长(为何最长呢?因为间桐慎二向来对自己的人品很有信心)。 Input

bzoj3670 Noi2014动物园 - exkmp

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3670 题意:求出一个num数组一一对于字符串S的前i个字符构成的子串T,有字符串既是T的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,将这种字符串的数量记作num[i]。求对1,000,000,007的取模 题解:不会kmp的我用exkmp做了。。求出的extend[]就是下面

动物园的栅栏

【问题描述】 小芳和她的朋友们沿着高度为 h 的动物园栅栏一起行走,他们不想惊扰到动物们,因此他们每个人的高度都不能超过 h ,如果他们中有人身高超过 h ,则他必须弯下腰来行走。 如果将正常行走的人的宽度视为1的话,那么当他弯下腰的时候宽度会变为2。小芳的朋友们想一边走一边聊天,他们希望尽量走成一排,但是道路宽度是有限的,因此可能要分成几排来行走。 给出朋友们的人数 n(包括小芳)、栅栏的

#2. 【NOI2014】起床困难综合症

拆分二进制 #include <cstdio>#include <iostream>#include <algorithm>#include <cstring>using namespace std;#define LL long longLL n,m;int to0[40],to1[40]; // 30char s[30];int main(){// freopen

BZOJ3670动物园——KMP变形

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

[UOJ 3]【NOI2014】魔法森林:LCT

点击这里查看原题 将所有路径按a升序排序,用LCT维护路径上最大的b,将边权化为点权,如果加入一条边x,其两端点分别为u,v,那么将u与i+x连边,v与i+x连边。 如果(u,v)路径最大的b值大于当前边的b,那么删去b最大的边。 注意:access操作中必须pushup,因为这个调了好久 /*User:SmallLanguage:C++Problem No.:3*/#inclu

[UOJ 5]【NOI2014】动物园:KMP

点击这里查看原题 cnt[i]表示从i出发,经过cnt[i]次nex[i]到达0。于是做两次KMP,第一次求nex[i]和cnt[i],第二次求i一直nex[i]到达的第一个≤i/2的位置 /*User:SmallLanguage:C++Problem No.:5*/#include<bits/stdc++.h>#define ll long long#define inf ((

「NOI2014」 魔法森林 - 动态树LCT

题目描述 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士。魔法森林可以被看成一个包含个 N N N节点 M M M条边的无向图,节点标号为 1 ⋯ N 1\cdots N 1⋯N,边标号为 1 ⋯ M 1\cdots M 1⋯M。初始时小E同学在号节点 1 1 1,隐士则住在号节点 N N N。小E需要通过这一片魔法森林,才能够拜访到隐士。 魔法森林中居住了一些妖怪。每当有

nodejs微信小程序+python+PHP的热带野生动物园景点预约订票系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:技术背景 5 3.2.2经济可行性