首页 > 其他分享 >洛谷题单指南-字符串-P3435 [POI2006] OKR-Periods of Words

洛谷题单指南-字符串-P3435 [POI2006] OKR-Periods of Words

时间:2024-10-16 14:44:11浏览次数:5  
标签:子串 OKR 前缀 后缀 洛谷题 POI2006 Next int 周期

原题链接:https://www.luogu.com.cn/problem/P3435

题意解读:定义字符串a是b的周期,当a是b的真前缀,且b是aa的前缀。给定字符串s,求s每一个前缀的最大周期长度之和。

解题思路:

针对字符串babababa进行样例模拟:

前缀子串   最大周期   周期长度
b 0
ba 0
bab ba 2
baba ba 2
babab baba 4
bababa baba 4
bababab bababa 6
babababa bababa 6

最大周期长度之和为24。

观察一下每行前缀除了最大周期,剩下的元素(绿色部分)有什么特点?

前缀子串   最大周期
b
ba
bab ba
baba ba
babab baba
bababa baba
bababab bababa
babababa bababa

要让剩下的元素是两个周期连接后"周期周期"的前缀,那么绿色部分必然是整个子串的前缀,并且要使得周期长度最大,绿色部分必须最短,也就是要求每个子串的最短相同前后缀。

前面已经在KMP算法中介绍过,Next[]数组的含义就是每个子串的最长相同前后缀,那么可以基于最长相同前后缀去计算最短相同前后缀,

比如要计算0~j的最短相同前后缀,可以不断判断Next[Next[j] - 1]找到为0前的最后一个非0值即可,如图所示:

最后,得到每个子串的最短相同前后缀长度之后,一个子串的最大周期=子串长度 - 最短相同前后缀长度(前提是周期不为空)

100分代码:

#include <bits/stdc++.h>
using namespace std;

int n;
string s;
int Next[1000005];
long long ans;

int main()
{
    cin >> n >> s;
    //计算每个子串的最长相同前后缀长度
    for(int i = 1, j = 0; i < n; i++)
    {
        while(j && s[i] != s[j]) j = Next[j - 1];
        if(s[i] == s[j]) j++;
        Next[i] = j;
    }
    //计算每个子串的最短相同前后缀长度
    for(int i = 0; i < n; i++)
    {
        int j = Next[i];
        while(j && Next[j - 1]) j = Next[j - 1];
        Next[i] = j;
    }
    //计算答案
    for(int i = 0; i < n; i++)
    {
        if(Next[i] > 0) ans += i + 1 - Next[i]; //每个子串的proper前缀即子串长度减去最短前后缀长度
    }
    cout << ans;
    return 0;
}

 

标签:子串,OKR,前缀,后缀,洛谷题,POI2006,Next,int,周期
From: https://www.cnblogs.com/jcwy/p/18469917

相关文章

  • 142页满分PPT | 企业产品研发管理体系构建指南(IPD+OKR+PLM)
    在当今竞争激烈的商业环境中,企业要想在市场中脱颖而出,必须拥有一套完善的产品研发管理体系。《企业产品研发管理体系构建指南(IPD+OKR+PLM)》就是这样一份旨在帮助企业构建高效、系统性研发解决方案的指南。这份142页的PPT详细介绍了如何通过集成产品开发(IPD)、CMMI、目标与关键结......
  • 洛谷题单指南-字符串-Test
    原题链接:https://www.luogu.com.cn/problem/CF25E https://codeforces.com/contest/25/problem/E题意解读:给定a,b,c三个字符串,求包含a、b、c的最短字符串长度。解题思路:要得到包含a、b、c的字符串,可以通过a、b、c连接形成,而要使得连接后的字符串最短,可以尽可能的利用重叠部分......
  • 洛谷题单指南-字符串-P1470 [USACO2.3] 最长前缀 Longest Prefix
    原题链接:https://www.luogu.com.cn/problem/P1470题意解读:求s最长前缀长度,使得可以拆解成p集合中的字符串解题思路:动态规划:设s字符串下标从1开始,p集合用set<string>保存所有的元素状态表示:设f[i]表示前i个字符s[0~i-1]是否能拆解成p中的元素状态计算:对于j=i-1开始往后倒......
  • 【程序人生】互联网老兵给自己定了一个OKR
    开门见山,简单做个自我介绍。本人16年毕业,本硕都是985理工科院校,计算机专业。时光荏苒,岁月如梭。不知不觉已经在互联网行业工作8年多了,在国内Top互联网大厂B(ytedance)AT其中的两家待过,算是一个不太老的老兵了。喜欢研究计算机基础原理,有移动端全栈(包括Android&iOS&鸿蒙等)开......
  • 洛谷题单指南-字符串-P5283 [十二省联考 2019] 异或粽子
    原题链接:https://www.luogu.com.cn/problem/P5283题意解读:n个整数,每次从从取l~r的数进行异或得到美味值,一共取k次,并计算这k个美味值之和的最大值。解题思路:1、如何O(1)的计算l~r数的异或,得到美味值可以借助前缀和思想,a[i]为第i个数,s[i]表示a[1]~a[i]每个数的异或值,要计算l~r的......
  • 洛谷题单指南-字符串-P2580 于是他错误的点名开始了
    原题链接:https://www.luogu.com.cn/problem/P2580题意解读:给n个字符串,再依次处理m个字符串,对于每个字符串,如果在前面n个字符串中输出OK,如果不在n个字符串中输出WRONG,如果在n个字符串中且不止一次查询过输出REPEAT。解题思路:1、set/map方法很简单直接,用set存下前n个字符串,map......
  • 洛谷题单指南-字符串-P1481 魔族密码
    原题链接:https://www.luogu.com.cn/problem/P1481题意解读:在n个字符串中找到最长的词链长度,定义字符串a、b、c可以形成词链,即a是b的前缀、b是c的前缀。解题思路:1、Trie树定义Trie树,也称前缀树、字典树,核心思想是将字符串拆解为单个字符,每个字符是树的一条边,节点是字符添加到树......
  • OKR与多维度绩效指标评估体系融合,有效提升员工执行
    客户背景在医药行业这个高度竞争且快速变化的领域,企业不仅需要关注短期的财务表现,更需具备长远的战略眼光和持续的创新能力。某药企为了更好地应对市场挑战,提升组织效能,决定将OKR体系与多维度绩效指标评估体系相融合,实现更加精准、全面的绩效管理。业务痛点战略与执行脱节......
  • 洛谷题单指南-字符串-P4391 [BOI2009] Radio Transmission 无线传输
    原题链接:https://www.luogu.com.cn/problem/P4391题意解读:s1由若干个s2组成,求s2的最小长度,注意题目中说明s1是子串,但是不影响,可以认为s1是补全的由若干s2组成的字符串。解题思路:设s1由x个s2组成,如图所示设s1的Next数组从0开始,那么其最长相同前后缀长度为x-1个s2,即Next[s1.siz......
  • GeoKR系列--Geographical Knowledge-Driven Representation Learning for Remote Sens
    一、abstract1.绝大多数遥感图像仍未标注,想要充分利用这些未标注的图像,本文提出了一种基于地理知识驱动的表示学习方法,使得提升遥感图像的网络性能+减少对标注数据的需求。2.本文将全球地表覆盖产品和与每张遥感图像相关的地理位置视为地理知识,为了消除遥感图像与地理知识之......