【KMP】OKR-Periods of Words

题目描述

串是有限个小写字符的序列,特别的,一个空序列也可以是一个串。一个串P是串A的前缀,当且仅当存在串B,使得A=PB。如果P≠A并且P不是一个空串,那么我们说P是A的一个proper前缀。
定义Q是A的周期,当且仅当Q是A的一个proper前缀并且A是QQ的前缀(不一定要是proper前缀)。比如串abab和ababab都是串abababa的周期。串A的最大周期就是它最长的一个周期或者是一个空串(当A没有周期的时候),比如说,ababab的最大周期是abab。串abc的最大周期是空串。
给出一个串,求出它所有前缀的最大周期长度之和。

输入

第一行一个整数k,表示串的长度。
接下来一行表示给出的串。

输出

输出一个整数表示它所有前缀的最大周期长度之和。

样例输入

8
babababa

样例输出

24

提示

对于全部数据,1<k<1e6


【题意】:

看题意,人话吗?我真的看了很久很久,最后还是找博客上的解释才看懂是什么 意思。。。

参考博客:蒟蒻のblog


思路

先把题面转成人话:

对于给定串的每个前缀i,求最长的,使这个字符串重复两边能覆盖原前缀i的前缀(就是前缀i的一个前缀),求所有的这些“前缀的前缀”的长度和

利用nextnext的性质:前缀ii的长度为next[i]的前缀和后缀是相等的

这说明:如果有i一个公共前后缀长度为j,那么这个前缀i就有一个周期为i-j

见下图

显然图中蓝色线段是黑色线段的一个周期

那么接下来的问题就容易了:

先求出next数组


【代码】:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N = 1e6 + 10;
 4 typedef long long ll;
 5 char p[N];
 6 int Next[N],m;
 7
 8 void get_Hash(){
 9     for(int i=2,j=0; i<=m;i++){
10         while( j && p[i] != p[j+1] ) j = Next[j];
11         if( p[i] == p[j+1] ) j++;
12         Next[i] = j ;
13     }
14 }
15 int main()
16 {
17     scanf("%d",&m);
18     scanf("%s",p+1);
19     ll ans = 0 ;
20     get_Hash();
21     for(int i=1;i<=m;i++){
22         int j = i ;
23         while( Next[j] ) j = Next[j];
24         if( Next[i] ) Next[i] = j ;
25         ans = ans + (i-j);
26     }
27     printf("%lld\n",ans);
28     return 0 ;
29 }

View Code

转载于:https://www.cnblogs.com/Osea/p/11333584.html

【KMP】OKR-Periods of Words相关推荐

  1. 【KMP】Radio Transmission(最小循环子串)

    [KMP]Radio Transmission(最小循环子串) Description 给你一个字符串,它是由某个字符串不断自我连接形成的.但是这个字符串是不确定的,现在只想知道它的最短长度是多少. ...

  2. 【kmp】似乎在梦中见过的样子

    参考博客: BZOJ 3620: 似乎在梦中见过的样子 [KMP]似乎在梦中见过的样子 题目描述 「Madoka,不要相信QB!」伴随着Homura的失望地喊叫,Madoka与QB签订了契约. 这是M ...

  3. ACM入门之【KMP】

    KMP可以O(n)的时间查找出一个字符串在另一个字符串出现的次数和位置. KMP 的精髓在于,对于每次失配之后,我都不会从头重新开始枚举,而是根据我已经得知的数据,从某个特定的位置开始匹配:而对于模式 ...

  4. 【bzoj3620】【似乎在梦中见过的样子】【kmp】

    Description "Madoka,不要相信 QB!"伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka 的一个噩梦,也同时是上个轮回 ...

  5. 【KMP】从原理上详解next数组和nextval数组

    本文将从原理上详细解释KMP算法中的next数组以及nextval数组,尽量让大家明白它们到底在记录什么,为什么要这样算.以及现在普遍的KMP算法实现当中的next数组与前两者有何不同.篇幅较长,但尽 ...

  6. [NOI2014]动物园 【kmp】

    题目描述 每次写kmp都要调一万年 这题主要两个数组next[]next[]和num[]num[] num[i]num[i]表示以ii结尾的前缀所能匹配的数量(可重叠的) 代码 #include< ...

  7. [BZOJ 3942] [Usaco2015 Feb] Censoring 【KMP】

    题目链接:BZOJ - 3942 题目分析 我们发现,删掉一段 T 之后,被删除的部分前面的一段可能和后面的一段连接起来出现新的 T . 所以我们删掉一段 T 之后应该接着被删除的位置之前的继续向后匹 ...

  8. 【SDOI2017】硬币游戏【KMP】【概率期望】【高斯消元】

    题意:给 nnn 个长度为 mmm 的 01 串,一个 01 串初始为空,不断随机一个字符加在后面,当出现给定的 nnn 个串中的一个时停止.分别求在 nnn 个串处停止的概率. 考场思路历程: 显然 ...

  9. 【CF1200E】Compress Words【kmp】

    传送门 题意:给NNN个由大小写字母.数字组成的字符串,两个字符串S,TS,TS,T合并时,删除TTT最长的是SSS的后缀的前缀,然后接在一起.现将这些字符串依次合并,求最终字符串. N≤1e5,∑∣ ...

最新文章

  1. python详细安装教程 path-Python解释器安装教程以及环境变量配置
  2. LOJ P1155 双栈排序 二分图染色 图论
  3. UA MATH571A R语言回归分析实践 一元回归3 NBA球员的工资
  4. 【windows】Qt打开资源管理器并选中指定文件
  5. c中volatile用法
  6. 全量更新和增量更新_增量BIOS更新或直接更新到最新版本哪个更好?
  7. Java数据库篇2——数据库基本操作
  8. 1062. 最简分数(20)-PAT乙级真题
  9. python3.9.0a2怎么安装pygame_Python自学——pygame安装
  10. AUTOSAR——AUTOSAR基础
  11. 腾讯视频网页版无法连接服务器失败怎么办,腾讯视频突然不能投屏怎么解决 腾讯视频突然不能投屏解决方法...
  12. python爬虫实践(三)——爬取煎蛋网图片
  13. WPS VBA遇到的问题小记
  14. Strong Convexity
  15. 《Temporal AA , SMAA and MSAA》
  16. 前端应届生如何做一个职业规划?已拿offer附真题解析
  17. 服务器引擎制作,2.5D-GIS地图引擎设计
  18. 运营商NFV MANO梦想照进现实
  19. Anaconda创建新环境及在pycharm中的设置
  20. 【MySQL】MySQL表的增删改查(进阶)

热门文章

  1. re-complie_re-中文_
  2. 应用在电视触摸屏中的十四通道智能触摸芯片
  3. c语言常考的笔试题1
  4. DBSCAN原理及matlab仿真代码
  5. CVPR 2022 最新106篇论文分方向整理|包含目标检测、动作识别、图像处理等32个方向
  6. SNMP的MIB文件语法
  7. 2021年R1快开门式压力容器操作考试资料及R1快开门式压力容器操作考试试卷
  8. android 电池容量修改,Android 使用adb查看和修改电池信息
  9. Matlab--创建函数(function)
  10. android studio开发rtk,Android安卓平板电脑