【border树】【P2375】动物园
Description
给定一个字符串 \(S\),对每个前缀求长度不超过该前缀一半的公共前后缀个数。
共有 \(T\) 组数据,每组数据的输出是 \(O(1)\) 的。
Limitations
\(1 \leq |S| \leq 10^6,~1 \leq T \leq 5\)
Solution
好水的NOI题
建出 \(border\) 树,对于树上每个节点,它的所有 \(border\) 与它的所有祖先一一对应。这是因为每个节点的父亲是它的最长 \(border\),数学归纳可以证明这个结论。
考虑对于这棵 \(border\) 树上任何一个节点到根的路径上节点的编号一定是单调减小的,这是因为每个结点的最长 \(border\) 显然小于自身。
因此,对于一个点 \(u\),如果 \(v\) 是一个合法的 \(border\),那么 \(v\) 的祖先一定是合法的 \(border\)。所以合法的 \(border\) 一定是一条以根为一个端点的链。
综合上面两条可以得出,如果 \(u\) 的合法 \(border\) 对应链的另一个端点为 \(v\),那么 \(u\) 的孩子的合法 \(border\) 的对应端点一定在 \(v\) 到 \(u\) 的路径上,因此这个端点位置是单调变深的。
所以只需要在 dfs 的时候维护根节点到该节点的链,并维护当前节点的答案位置即可。由于答案位置只会变大,因此答案位置的寻找是均摊 \(O(1)\) 的,暴力往下循环即可。
总时间复杂度 \(O(T |S|)\)。
Code
#include <cstdio>
#include <cstring>
#include <vector>
const int maxn = 1000006;
const int MOD = 1000000007;
int T;
int n, top;
ll ans;
char MU[maxn];
int border[maxn], pos[maxn], stack[maxn];
std::vector<int>son[maxn];
void KMP();
void clear();
int ReadStr(char *p);
void dfs(const int u);
int main() {
freopen("1.in", "r", stdin);
qr(T);
while (T--) {
clear();
n = ReadStr(MU + 1);
KMP();
for (int i = 1; i <= n; ++i) {
son[border[i]].push_back(i);
}
dfs(0);
qw(ans, '\n', true);
}
return 0;
}
int ReadStr(char *p) {
auto beg = p;
do *p = IPT::GetChar(); while ((*p > 'z') || (*p < 'a'));
do *(++p) = IPT::GetChar(); while ((*p >= 'a') && (*p <= 'z'));
*p = 0;
return p - beg;
}
void KMP() {
for (int i = 2, j = 0; i <= n; ++i) {
while (j && (MU[i] != MU[j + 1])) j = border[j];
if (MU[i] == MU[j + 1]) ++j;
border[i] = j;
}
}
void clear() {
ans = 1; top = -1;
for (auto &u : son) {
u.clear();
}
memset(pos, 0, sizeof pos);
}
void dfs(const int u) {
stack[++top] = u;
for (auto v : son[u]) {
int dv = v >> 1;
int &_ans = pos[v];
_ans = pos[u];
while ((_ans < top) && (stack[_ans + 1] <= dv)) ++_ans;
dfs(v);
}
if (pos[u]) {
(ans += pos[u] * ans) %= MOD;
}
--top;
}
【border树】【P2375】动物园的更多相关文章
- 洛谷P2375 动物园
我要死了.这是我做过的最恶心的题之一. 天下第一的大毒瘤.有gay毒. 我不如熊猫好多年... 题意:给定字符串,求g[i],表示:[0, i]中满足该子串既是前缀又是后缀还不重叠的子串数. 解:题面 ...
- 洛谷 P2375 动物园
题目详情 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定开设算法班,让动物们学习算法 ...
- P2375 动物园
入口 题目的大意就是输出以任意一个字符结尾,既是前缀,又是后缀,且长度不超过总长度的一半的方案书的乘积. 考虑使用kmp 在处理失配数组的同时,处理出来以每个字符结尾的时的,能有多少个前缀和后缀相同的 ...
- Border Theory
持续更新中!!!更个屁,无线停更! 前言: KMP 学傻了,看 skyh 说啥 border 树,跑来学 border 理论 洛谷云剪切板:https://www.luogu.com.cn/paste ...
- 【border相关】【P3426】 [POI2005]SZA-Template
[border相关][P3426] [POI2005]SZA-Template Description 给定一个字符串 \(S\),要求一个最短的字符串 \(T\),使得 \(S\) 可以由 \(T\ ...
- 51nod1600 Simple KMP
题目描述 对于一个字符串|S|,我们定义fail[i],表示最大的x使得S[1..x]=S[i-x+1..i],满足(x<i) 显然对于一个字符串,如果我们将每个0<=i<=|S|看 ...
- 模板库 ~ Template library
TOC 建议使用 Ctrl+F 搜索 . 目录 小工具 / C++ Tricks NOI Linux 1.0 快速读入 / 快速输出 简易小工具 无序映射器 简易调试器 文件 IO 位运算 Smart ...
- 洛谷 P2375 [NOI2014]动物园 解题报告
P2375 [NOI2014]动物园 题目描述 近日,园长发现动物园中好吃懒做的动物越来越多了.例如企鹅,只会卖萌向游客要吃的.为了整治动物园的不良风气,让动物们凭自己的真才实学向游客要吃的,园长决定 ...
- VIJOS P1081 野生动物园 SBT、划分树模板
[描述] cjBBteam拥有一个很大的野生动物园.这个动物园坐落在一个狭长的山谷内,这个区域从南到北被划分成N个区域,每个区域都饲养着一头狮子.这些狮子从北到南编号为1,2,3,…,N.每头狮子都有 ...
随机推荐
- Java学习清单
转自: csdn/zuochao_2013/article/details/76795164 · Java基础部分 *Java基础才是重中之重,只有基础打牢了,学习各种框架才能游刃有余. 1, ...
- scala基础题--100以内的数求和,求出当和第一次大于20的当前数【for】
import util.control.Breaks._ object work01 { def main(args: Array[String]): Unit = { //方式一 var sum:I ...
- WebStrom安装Markdown插件
安装步骤 File→Settings→Plugins→关键字搜索markdown→选择Markdown Navigator→点击Install→出现下载弹窗,等待下载完毕→重启Webstrom 效果预 ...
- 异步编程的类型系统:promise & future & closure & observable----异步编程类型的结构和操作
异步编程类型的结构和操作. 上下文维护. A promise represents the eventual result of an asynchronous operation. The prim ...
- python输入一个字符串,输出翻转后的字符串(翻转字符串)
题目:输出一个字符串,输出翻转后的字符串.例如:输入字符串a123,输出321a. 方法一:使用列表的reverse方法 string=input('请输入一个字符串:') lst=list(stri ...
- 关于使用PreApplicationStartMethod实现module注册问题
在使用PreApplicationStartMethod实现module注册问题发现一个问题: //用PreApplicationStartMethod实现自注册模块 [assembly: PreAp ...
- Unity Ioc 依赖倒置及Untity AOP被动拦截/自动拦截
各位博友金安,首先声明这是一篇转载的博客,原文链接:https://www.cnblogs.com/scottpei/archive/2013/01/08/2851087.html 十年河东,十年河西 ...
- JAVA中的四种JSON解析方式详解
JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...
- iOS7的十个更“佳”:简洁直观更受青睐
转自:http://www.25pp.com/news/news_27792.html iOS7自发布以来一直是褒贬不一,虽然苹果还只是发布了第二个测试版,但普通用户早已经在纠结到底该不该升级iOS7 ...
- android自定义圆角实线边框,圆角虚线边框,直实线,虚实线,半圆角边框
先上图 在现实项目开发中,单纯的Button,EditText等控件远远不能满足我们项目的UI设计需求,这时候,我们就需要自己动手丰衣足食啦.接下来先给大家介绍一些属性,备注写的都非常清楚啦,我就不啰 ...