洛谷2375 NOI2014动物园(KMP)
题目链接:
题目.
简单一点来说,这个题就是求一个字符串的\(num\)数组的和,其中有\(num[i]\)表示1~i中有多少个不交叉的相等的前缀和后缀 的数目,要求一个\(O(n)\)的做法
QwQ
感觉一看到这个题,其实没什么思路呀
从\(KMP\)的角度出发,对于一个\(i\)来说,显然\(pre[i],pre[pre[i]]\)都是他的后缀,所以,我们貌似可以维护一个\(num1\)表示,可以交叉的 相等的 前缀和后缀的数目
比较容易推出\(num1[i]=num1[pre[i]]+1\)
这里可以理解成 在原来最多的数目上,再加上当前位匹配的贡献
因为你对于当前的i的一些前后缀的比较和计算,已经在\(pre[i]\)的时候计算过了
那么我们怎么计算这个题目要求的\(num\)呢
QwQ实际上对于每个\(i\)要找到一个小于\(\frac{i}{2}\)的最小递归层数的\(pre\) (递归的意思是\(pre[pre[pre[i]]]\))
如果我们对于每一个\(i\)都暴力去做的话,时间复杂度肯定是不允许的,这时候我们就需要考虑一个性质:
我们在循环到\(i\)时当前的\(j\)是不是可以重前一次的最长的不重叠的\(j\)得到呢?答案是肯定的,要么小于等于上一次的\(j\),要么等于上一次的\(j+1\)
具体证明可以通过反证法来证明
QwQ然后就直接像\(KMP\)那种跳的方式,跳\(j\)就可以的
感觉这个题很有意思QwQ而且我还不是很懂呀
留个坑吧
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
const long long mod = 1e9+7;
const int maxn = 1e6+1e2;
int pre[maxn],num[maxn];
char s[maxn];
char s1[maxn];
long long ans=0;
int n;
int t;
void init()
{
for (int i=1;i<=maxn-10;i++) s[i]=s1[i];
memset(pre,0,sizeof(pre));
ans=1;
memset(num,0,sizeof(num));
}
int main()
{
cin>>t;
while (t--)
{
init();
scanf("%s",s+1);
n=strlen(s+1);
pre[1]=0;
num[1]=1;
for (int i=2;i<=n;i++)
{
int j=pre[i-1];
while (j && s[j+1] !=s[i]) j=pre[j];
if (s[j+1]==s[i]) j++;
pre[i]=j;
num[i]=num[j]+1;
}
int j=0;
for (int i=1;i<=n;i++)
{
while (j && s[j+1] !=s[i]) j=pre[j];
if (s[j+1]==s[i]) j++;
while ((j << 1)>=i+1) j=pre[j];
ans=ans*(num[j]+1)%mod;
}
cout<<ans<<endl;
}
return 0;
}
洛谷2375 NOI2014动物园(KMP)的更多相关文章
- 【题解】洛谷P2375 [NOI2014] 动物园(KMP)
洛谷P2375:https://www.luogu.org/problemnew/show/P2375 思路 这道题可以说是完全刷新了本蒟蒻对KMP的理解 感觉对next数组的理解上升到一个新的高度 ...
- [洛谷P2375] [NOI2014]动物园
洛谷题目链接:[NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决 ...
- 洛谷 P2375 [NOI2014]动物园 解题报告
P2375 [NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定 ...
- 【KMP】洛谷P2375 [NOI2014]动物园 题解
一开始的方向应该对了,但是没有想到合理的优化还是没写出来…… 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己 ...
- 洛谷 P2375 [NOI2014]动物园
题目传送门 解题思路: 其实对于一个sum[i],其值就等于sum[next[i]] + sum[next[next[i]]] + ... + 1,然后我们可以记忆化,然后题目里又有一个限制,就是前后 ...
- 洛谷2375 BZOJ 3670动物园题解
题目链接 洛谷链接 我们发现题目要我们求的num[i]东西本质上其实是 求有多少以i结尾的非前缀且能与前缀匹配的字符串,而且要求字符串长度小于(i/2) 我们先不考虑字符串长度的限制,看所有以i结尾的 ...
- BZOJ3670 & 洛谷2375 & UOJ5:[NOI2014]动物园——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=3670 https://www.luogu.org/problemnew/show/P2375#su ...
- BZOJ3670:[NOI2014]动物园(KMP)
Description 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习 ...
- BZOJ 3670: [Noi2014]动物园 [KMP]
求这玩意: 对于字符串S的前i个字符构成的子串,既是它的后缀同时又是它的前缀,并且该后缀与该前缀不重叠,将这种字符串的数量记作num[i] 对1,000,000,007取模的结果 n≤5,L≤1,00 ...
随机推荐
- MySQL中的seconds_behind_master的理解
通过show slave status查看到的Seconds_Behind_Master,从字面上来看,他是slave落后master的秒数,一般情况下,也确实这样,我们可以通过Seconds_Beh ...
- GUI实现超简单的计算器
计算器样式 实现代码 //实现超简易的计算器 public class Test02 { public static void main(String[] args) { Counter counte ...
- sublime text 3 中文排序插件
ST3 的排序不支持中文按拼音排序,所以需要搞一个插件来支持这一特性 pypinyin 这个库可以把中文转成拼音,可惜不支持 python3.3,而 ST3 内置的 python 就是 3.3 我系统 ...
- 你的 JVM 基础“大厦”稳健吗?
[从 1 开始学 JVM 系列] JVM 对于每位 Java 语言编程者来说无疑是"重中之重",尽管我们每天都在与它打交道,却很少来审视它.了解它,慢慢地,它成为了我们" ...
- linux网络编程(一)
============================================================== 第一天:基本概念.TCP.FTP: =================== ...
- python3 用multiprocessing模块传递多个参数
from datetime import datetime from time import sleep import numpy as np import multiprocessing # fro ...
- MySQL实战45讲(16--20)-笔记
目录 16 | "order by"是怎么工作的? 全字段排序 rowid 排序 17 | 如何正确地显示随机消息? 内存临时表 磁盘临时表 随机排序方法 18 | 为什么这些SQ ...
- js简单化技巧
1.交换两个变量而没有第三个 let x = 1;let y = 2;[x, y] = [y, x];console.log(x, y); 输出: 2 1 2.将数字转换为字符串 const num ...
- 动态规划精讲(一)A单串
单串 单串 dp[i] 线性动态规划最简单的一类问题,输入是一个串,状态一般定义为 dp[i] := 考虑[0..i]上,原问题的解,其中 i 位置的处理,根据不同的问题,主要有两种方式: 第一种是 ...
- CVPR顶会论文爬取存入MySQL数据库(标题、摘要、作者、PDF链接和原地址)
main.py import pymysql import re import requests # 连接数据库函数 from bs4 import BeautifulSoup def insertC ...