OKR-Periods of Words

news/2024/5/18 23:12:16

[POI2006] OKR-Periods of Words

题面翻译

对于一个仅含小写字母的字符串 \(a\)\(p\)\(a\) 的前缀且 \(p\ne a\),那么我们称 \(p\)\(a\) 的 proper 前缀。

规定字符串 \(Q\) 表示 \(a\) 的周期,当且仅当 \(Q\)\(a\) 的 proper 前缀且 \(a\)\(Q+Q\) 的前缀。若这样的字符串不存在,则 \(a\) 的周期为空串。

例如 ababab 的一个周期,因为 ababab 的 proper 前缀,且 ababab+ab 的前缀。

求给定字符串所有前缀的最大周期长度之和。

样例 #1

样例输入 #1

8
babababa

样例输出 #1

24

数据范围

$k (1\le k\le 1\ 000\000) $

解析

字符串周期,阅读理解题。

如上图,将白 \(X\) 复制一倍,这时 \(Y\) 是所有 \(X\) 的子串,所以黄色框起来的 \(Y\) 必须相同。

为了让 \(X \times 2\) 刚好和 \(Y\) 对齐,\(Y\) 前后相同的部分应尽量短,也就是求最短的 \(border\).

答案长度就是 \(len-p_{min}\) (减去后面那两个 \(Y\)),

求最短的前缀函数见 动物园,

但是暴力求解会 \(\mathbb{T}\) ,可采用记忆化,每次找到最小的就把当前 \(p\) 置成最小值。

code

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
long long n,p[N];
string s;
long long ans;
int main()
{scanf("%lld",&n); cin>>s;for(int i=1;i<n;i++){int j=p[i-1];while(j&&s[i]!=s[j]) j=p[j-1];p[i]=j+(s[i]==s[j]);}for(int i=1;i<n;i++){int j=p[i]; if(!j) continue;while(p[j-1]) j=p[j-1];p[i]=j;ans+=i+1-j;	}printf("%lld\n",ans);return 0;
}

注意

KMP j=p[j-1] ,中的 j-1 是为了让长度和下标对齐。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/28225.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Phone List

题目描述输入格式输出格式样例 样例输入 2 3 911 97625999 91125426 5 113 12340 123440 12345 98346 样例输出 NO YES 数据范围与提示这道题的三条判断是否存在前缀的标准:当在建树字符串已经到结尾时,如果该点有结束标记,那肯定是前缀(不是真前缀)当在建树字符串已经到结…

SSM教务管理系统设计与实现(附源码下载地址)

@目录01 项目背景02 使用技术03 运行环境04 功能分析05 数据库设计06 项目工程结构07 部分功能展示及源码7.1 登录页7.2 管理员端--首页7.3 管理员端--课程管理7.4 管理员端--学生管理7.5 教师端--首页7.6 教师端--个人信息7.7 学生端--已修课程7.8 学生端--公告管理08 运行教程…

AutoCAD C# 两不平行直线倒圆弧算法

参考的博客:https://www.cnblogs.com/JJBox/p/14300098.html 下面是计算示例主要计算代码:var peo = new PromptEntityOptions("选择直线1"){AllowNone = false,AllowObjectOnLockedLayer = false};peo.SetRejectMessage("请选择直线Line");peo.AddAllow…

挖矿流量分析之Stratum挖矿协议

目录前言区块链和挖矿相关概念挖矿木马挖矿协议StratumStratum工作过程 前言 之前做了一个关于“挖矿行为检测”的大创训练项目,在这里记录一下我关于挖矿检测相关内容的学习。 区块链和挖矿相关概念 区块链 首先需要了解一些关于区块链的内容。注意,区块链和挖矿是两个紧密相…

sublime设置默认打开侧边栏(失败)

描述 每次使用sublime打开某个目录,总是不显示侧边栏,还得手动打开。 过程 在设置里找了半天似乎没有这个选项,有点离谱,网上搜到的全是手动打开侧边栏。看来只能Ctrl+KB按得勤快些了。// Display the toggle sidebar button in the status bar"show_sidebar_button&q…

C++模板

C++模板 C++是一个面向对象编程的语言,提供了类的继承和组合机制,虽然在层次结构上很简单,但使用起来非常糟糕。C++使用关键字template,告诉编译器声明的类或者对象是一个模板。模板不是像继承和组合那样重用目标代码,而是重用源代码。容器不再包含名为 Object 的泛型基类…

Matlab安装教程(Linux)

解压安装包 在虚拟机中,文件直接通过拖拽文件的方式将安装包拉入虚拟机时,文件通常存放在/tmp/VMwareDnD中,因此需要将存放文件位置的文件转移到/home/<用户名>/<存放目录>中 参考命令如下: mv /tmp/VMwareDnD/<文件存放目录>/* /home/<用户名>/&l…

2. 基础配置

1. 配置文件格式 1.1 配置文件自动提示功能消失解决方案 ​​ 1.2 SpringBoot配置文件加载顺序(了解) application.properties > application.yml > application.yaml 1.3 注意事项 SpringBoot核心配置文件名为application SpringBoot内置属性过多,且所有属性集中…