bzoj3670 Noi2014动物园 - exkmp

2024-05-12 00:18

本文主要是介绍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[]就是下面代码的nt[],它表示字符串S与自己的后缀的匹配长度。可以发现,对每次的成功的匹配,它对num[i]-num[i+min(i-1,nt[i])都有1的贡献(注意求的是数量啊喂为此WA了一次的菜鸡挥泪提醒)。于是搞搞弄成线性的就好啦~

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1001000
#define Mod  1000000007int nt[maxn],num[maxn];
char s[maxn];
int mymin(int x,int y){return (x<y)?x:y;}
int mymax(int x,int y){return (x>y)?x:y;}
int main()
{int T,i,id,mx,len;long long as;scanf("%d\n",&T);while (T--){gets(s+1);len=strlen(s+1);memset(nt,0,sizeof(nt));memset(num,0,sizeof(num));id=1;mx=0;nt[1]=len;for (i=2;i<=len;i++){if (mx>i+nt[i-id+1]-1) nt[i]=nt[i-id+1];else{nt[i]=mymax(mx-i+1,0);while (i+nt[i]<=len && s[1+nt[i]]==s[i+nt[i]]) nt[i]++;if (i+nt[i]-1>mx) mx=i+nt[i]-1,id=i;}num[i]+=1;num[i+mymin(i-1,nt[i])]-=1;}as=1;for (i=2;i<=len;i++){num[i]+=num[i-1];int orz=(1+num[i])%Mod;as=(as*orz)%Mod;}printf("%lld\n",as);}return 0;
}


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



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

相关文章

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

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

KMP,EXKMP 扩展KMP

EXKMP是KMP算法的一个扩展和加难,可以解决一些KMP无法解决的问题 先回顾一下KMP KMP KMP的关键是next数组 next[i]表示的是s[1~next[i]]=s[i-next[i]+1~i] 在进行字符串匹配时如将s和t匹配时 如果t[i+1]和s[j+1]不对时,可以将t[i+1]和s[next[j]+1]进行匹配,因为next数组满足上面的性质,可以保证s[1~n

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

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

hdu4333 Revolving Digits - exkmp

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4333 题意:多组数据,给一串数字,问每次旋转得到的数字串比原串小、等、大的数量。e.g.原串为"341",而3次旋转得到的数字串分别是:341、134、413。故答案输出1 1 1 题解:exkmp;题目中说的是能构成的不同的串,而当且仅当原串有循环节时所构成的串有重复(自己想想),所以先用nex

HDU3613 Best Reward - exkmp/Manacher

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3613 题意:多组数据,给定每个字母的价值和一个串S,要把这个串S分成两个串T1、T2,若某串T是回文串那么就能获得该串上字母的价值,否则可获得的价值为0,求最大价值 题解:RT 用exkmp或者马拉车搞一搞就好了 心得什么的:撒比的我想着用exkmp搞,练习一下,结果..一搞就搞了半个世纪qwq

动物园的栅栏

【问题描述】 小芳和她的朋友们沿着高度为 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 ((