P2375 动物园
题目的大意就是输出以任意一个字符结尾,既是前缀,又是后缀,且长度不超过总长度的一半的方案书的乘积。
考虑使用kmp
在处理失配数组的同时,处理出来以每个字符结尾的时的,能有多少个前缀和后缀相同的数量。
然后在进行一次类似kmp的匹配,在这次匹配中处理出来答案。
先是为什么要处理多少个前缀和后缀相同的数量。
比如说,b是a的前缀和后缀,c是b的前缀和后缀(都合法)
然后c也肯定是a的前缀和后缀。处理出这个数组来,我们在寻求答案是只需要找到第一个符合条件的前缀&&后缀。加上我们预处理的个数就可以了。
//50分
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
char data[1010000];
int fail[1010000];
int num[1010000];
int main()
{ int m;
scanf("%d",&m);
while(m--)
{
scanf("%s",data);
memset(fail,0,sizeof(fail));
memset(num,0,sizeof(num));
int len=strlen(data)-1;
int k=0;num[1]=1;
for(int i=1;i<=len;i++)
{
while(k&&data[i]!=data[k])
k=fail[k];
if(data[i]==data[k]) fail[i+1]=++k;
num[i+1]=num[k]+1;
}
long long ans=1;
const long long mode=1e9+7;
for(int i=1;i<=len+1;i++)
{
k=i;
while((k<<1)>i)
k=fail[k];
ans=(ans*(num[k]+1))%mode;
}
printf("%lld\n",ans);
}
}
这是每次暴力从尾利用失配数组暴力蹦跶。
然后我们考虑加速一波。
每次从当前尾部暴力蹦跶肯定不行,我们考虑一下加速。
我们再一次利用类似kmp的方法。
因为我们每次只向后推一位结尾。
我们就可以利用上一次失配指针的位置,进行转移。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
char data[1000010];
int fail[1000010];
int num[1000010];
const long long mode=1e9+7;
int main()
{
int m;scanf("%d",&m);
while(m--)
{
memset(fail,0,sizeof(fail));
memset(num,0,sizeof(num));
scanf("%s",data);
int len=strlen(data)-1;
int k=0;num[1]=1;
for(int i=1;i<=len;i++)
{
while(k&&data[i]!=data[k]) k=fail[k];
if(data[i]==data[k]) fail[i+1]=++k;
num[i+1]=num[k]+1;
}
k=0;
long long ans=1;
for(int i=1;i<=len+1;i++)
{
while(k&&data[i]!=data[k]) k=fail[k];
while((k<<1)>=i)
k=fail[k];
if(data[i]==data[k]) ++k;
ans=(ans*(num[k]+1))%mode;
}
printf("%lld\n",ans);
}
}
P2375 动物园的更多相关文章
- 洛谷 P2375 动物园
题目详情 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法 ...
- 洛谷P2375 动物园
我要死了.这是我做过的最恶心的题之一. 天下第一的大毒瘤.有gay毒. 我不如熊猫好多年... 题意:给定字符串,求g[i],表示:[0, i]中满足该子串既是前缀又是后缀还不重叠的子串数. 解:题面 ...
- [luogu P2375] [NOI 2014] 动物园
[luogu P2375] [NOI 2014] 动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向 ...
- 洛谷 P2375 [NOI2014]动物园 解题报告
P2375 [NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定 ...
- 2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分)
2021.11.16 P2375 [NOI2014] 动物园(EXKMP+差分) https://www.luogu.com.cn/problem/P2375 题意: PS:这道神题的背景让人疑惑,重 ...
- 【题解】洛谷P2375 [NOI2014] 动物园(KMP)
洛谷P2375:https://www.luogu.org/problemnew/show/P2375 思路 这道题可以说是完全刷新了本蒟蒻对KMP的理解 感觉对next数组的理解上升到一个新的高度 ...
- [洛谷P2375] [NOI2014]动物园
洛谷题目链接:[NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决 ...
- 【KMP】洛谷P2375 [NOI2014]动物园 题解
一开始的方向应该对了,但是没有想到合理的优化还是没写出来…… 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己 ...
- P2375 [NOI2014]动物园
考虑kmp. 这个题的主要问题就在于怎样使复杂度是正确的O(n). 可以先预处理一个数组cnt[]表示不考虑不能相交这个限制,有多少个border. 这个东西其实也就是fail树上的深度. 然后考虑怎 ...
随机推荐
- mybatis 动态行转列
SELECT user_name , MAX(CASE course WHEN '数学' THEN score END ) 数学, MAX(CASE course WHEN '语文' THEN sco ...
- 利用划分树求解整数区间内第K大的值
如何快速求出(在log2n的时间复杂度内)整数区间[x,y]中第k大的值(x<=k<=y)? 其实我刚开始想的是用快排来查找,但是其实这样是不行的,因为会破坏原序列,就算另外一个数组来存储 ...
- maya2012安装失败如何卸载重装
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- maya 安装失败
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- Unity 为什么有时候播放音乐(音效)会没有声音
1.问题描述 昨晚,我遇到的情况如下: 1.MainCamera里有Audio Source,并且在循环播放音乐 2.在其他的GameObject中也新增一个Audio Source,在某个时机播放音 ...
- jQuery源代码学习笔记_01
如何获取jQuery源代码 1.可以从GitHub上下载到没有合并和压缩的源代码 2.如果要查看兼容IE6-8的版本,请选择1.x-master分支 3.可以使用git clone也可以使用downl ...
- php 可逆的加密算法
代码: <?php class Test { private $authCodeKey = 'khUvFB9pijNyCYMGZdzqeKalyg7dh'; function authCode( ...
- Day3下
少女[问题描述]你是能看到第一题的 friends呢.—— hja少女在图上开车, 她们希望把每条边分配给与其相连的点中一个并且每个点最多被分配一条边,问可能的方案数.[输入格式]第一行两个整数
- Win2D 官方文章系列翻译 - 与 Direct2D 互操作
本文为个人博客备份文章,原文地址: http://validvoid.net/win2d-interop-with-direct2d/ Win2D 作为 Direct2D 的上层实现,支持与其进行双向 ...
- ThinkPHP find大坑 不要随便用
举例: M("User")->find(3); $m=M("User"); $m->userName="aaa"; $m-> ...