OKR-Periods of Words(洛谷P3435 [POI2006] OKR-Periods of Words)

news/2024/10/6 22:20:53

OKR-Periods of Words

题目描述

输入格式

输出格式

样例

样例输入

8
babababa

样例输出

24

1. 题目到底要让我们求什么:

  • (首先这是一道kmp的题)这是每个位置kmp的数值,代表它的border(真前缀和后缀)

  • 这是由题意得出的每个位置的最长周期还没什么头绪

  • 结合这张图来看:黑色字为每个位置的编号(用i表示)我是从1开始存图的绿色字为每个位置的最小的既是前缀又是后缀(非真前缀)(用j表示)
    这样用i-j恰好等于蓝字(题目要求的最大周期Q) o( ̄▽ ̄)ブ

  • 既然这样我们就只需求出没个位置的最小的既是前缀又是后缀-->j,再用该位置编号去减它就可以了

2. 怎么求最小的既是前缀又是后缀-->j:

  • 这就需要用到kmp了,每次往前递归,当该值的border=0时,返回,此时这个值就是就是我们想要的j
    但这里有一个限制条件:我们的最大周期应该>=(i/2)

  • 当某个位置的kmp值为0时,如下图:j的初值设置就为i,此时不会进入while循环和第一个if语句,i的j值就为i
    (结合样例中的1,2位置理解)

for (int i=2;i<=len;i++) //查找每个i的最长周期 {int j=i;while (p[j]) j=p[j];  //记忆化优化 if (p[i]) p[i]=j;//p[i]为i能跳的最小值//i-j表示i的最长周期//判断合法性:只有当该周期>=i长度的一半时合法//(即题目中QQ能覆盖完A的全部) if ((i-j)>=(i>>1))ans+=i-j; }

3.记忆化优化:

  • 这个方法如果不用优化的话会T,当然优化方法不止记忆化,但本蒟蒻只会记忆化
if (p[i]) p[i]=j;//p[i]为i能跳的最小值
  • 当p[i]不为0时,更新p[i],下次就能一次性跳到啦!

4.代码

此处为代码:(p[maxn]数组存储的是跑kmp的值)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e6+10;
char a[maxn];
int p[maxn],len;
ll ans;
void kmp()
{for (int i=2,j=0;i<=len;i++) {while (j&&a[i]!=a[j+1]) j=p[j];if (a[j+1]==a[i]) j++;p[i]=j;}
}
void solve()
{//i=1时没有周期 for (int i=2;i<=len;i++) //查找每个i的最长周期 {int j=i;while (p[j]) j=p[j];  //记忆化优化 if (p[i]) p[i]=j;//p[i]为i能跳的最小值//i-j表示i的最长周期//判断合法性:只有当该周期>=i长度的一半时合法//(即题目中QQ能覆盖完A的全部) if ((i-j)>=(i>>1))ans+=i-j; }printf("%lld",ans);
}
int main()
{scanf("%d",&len);scanf("%s",a+1);kmp();solve();return 0;
}

完结撒花!

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

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

相关文章

修改PHPExcel兼容php7.4

https://blog.csdn.net/u012931845/article/details/133899174 翻译 搜索 复制

高校运维赛WEB部分-gxngxngxn

高校运维赛WEB部分-gxngxngxn phpsql 利用万能密码登录 admin/""="a=a 登录进后台后得到flagpyssrf 访问/source可以得到源码 from flask import Flask,request from redis import Redis import hashlib import pickle import base64 import urllib app = Flask…

大营销抽奖系统,DDD开发要如何建模?

作者:小傅哥 博客:https://bugstack.cn沉淀、分享、成长,让自己和他人都能有所收获!😄大家好,我是技术UP主小傅哥。 👨🏻‍💻 经过5.1假期的一顿框框输出,终于完成了《大营销项目》第二阶段的开发和上线,体验地址:https://gaga.plus 有了这个项目的落地,也终于…

WPF 从键盘事件 KeyEventArgs 里获取 Scan Code 的方法

本文将告诉大家如何在 WPF 里面,从键盘事件 KeyEventArgs 参数里获取到 Scan Code 键盘按键的设备独立标识符的方法概念: 以下来自 bing 的答案 键盘的 Scan Code 是按键的设备独立标识符,对应于按键在硬件上的实际标识。每个按键都有一个唯一的扫描码,用于表示该按键。当用…

worldclim 当前时期的生物气候变量数据存在的问题

bio2,3,4,6,7,9,12,13,14, 15,16,17,18,19 在格陵兰岛存在显著问题如下: 有明显的分割线。

读天才与算法:人脑与AI的数学思维笔记20_数学图灵测试

读天才与算法:人脑与AI的数学思维笔记20_数学图灵测试1. 数学图灵测试 1.1. 能不能将这种计算机证明语言翻译成易于与人交流的方式呢? 1.1.1. 剑桥大学的两位数学家蒂莫西高尔斯(Timothy Gowers)和莫汉加内萨林加姆(Mohan Ganesalingam)开展了此项研究 1.1.1.1. 他们决定…

EPYC 9B14(最强 Zen4 EPYC 2.6GHz 96c)简要上手感受

[CPU] EPYC 9B14(最强 Zen4 EPYC 2.6GHz 96c)简要上手感受 [复制链接] zlcrxp电梯直达 1# 发表于 2024-1-31 08:43 | 只看该作者 |只看大图 本帖最后由 zlcrxp 于 2024-1-31 16:47 编辑近期看到海鲜市场有EPYC 9B14,于是入手了一颗,由于入手时间比较短,目前先提供一些基本…

HTTP协议相关文档

HTTP The Hypertext Transfer Protocol (HTTP) is an application-level protocol for distributed, collaborative, hypermedia information systems. bing.com 翻译: 超文本传输协议 (HTTP) 是用于分布式的、协作的、超媒体信息系统的 应用程序级协议。IETF Internet Engi…