OKR-Periods of Words【KMP最小前后缀】
OKR-Periods of Words
传送门:链接 来源:UPC 8180
题目描述
串是有限个小写字符的序列,特别的,一个空序列也可以是一个串。一个串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<106
思路:
kmp算法中的Next[i]代表的是最大前后缀,即位置i的前后缀最大的相同长度为Next[i](若Next[0]=-1,长度即为Next[i]+1)。
这个题要求的是最小相同的前后缀(满足题目中周期的定义),可能不太好理解,看下图:(Next[0]=-1)

对应Next值:

求法:先正常求出Next数组,对每个Next[i]回溯到第一个不为-1的位置,并赋值给Next[i]。
例如当i=5时,Next[5]=Next[Next[5]]=1,其余同理。
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAX=1e6;
LL Next[MAX+5];
void getNext(string p,LL lp,LL Next[])
{
LL k=-1;
Next[0]=-1;
for(LL i=1;i<lp;i++){
while(k>-1&&p[k+1]!=p[i]) k=Next[k];
if(p[k+1]==p[i]) k++;
Next[i]=k;
}
}
int main()
{
LL lp;
string p;
cin>>lp>>p;
getNext(p,lp,Next);
for(LL i=0;i<lp;i++){
if(Next[i]==-1) continue;
else{
while(Next[Next[i]]!=-1){
Next[i]=Next[Next[i]];
}
}
}
LL sum=0;
for(LL i=0;i<lp;i++){
if(Next[i]!=-1)
sum+=(i-Next[i]);
}
cout<<sum<<endl;
return 0;
}
OKR-Periods of Words【KMP最小前后缀】的更多相关文章
- HDU 3613 Best Reward(扩展KMP求前后缀回文串)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割 ...
- poj 2752 Seek the Name, Seek the Fame【KMP算法分析记录】【求前后缀相同的子串的长度】
Seek the Name, Seek the Fame Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14106 Ac ...
- HDU 2594(求最长公共前后缀 kmp)
题意是在所给的两个字符串中找最长的公共前后缀,即第一个字符串前缀和第二个字符串后缀的最长相等串. 思路是将两个字符串拼接在一起,然后直接套用 kmp 算法即可. 要注意用 next 会报编译错误,改成 ...
- HDU 4763 Theme Section(KMP+枚举公共前后缀)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4763 题目大意: 给你一个字符串s,存在一个子串E同时出现在前缀.中间.后缀,即EAEBE这种模式,A ...
- FZU 1901 Period II(KMP循环节+公共前后缀)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1901 题目大意:题目大意求出所有p满足s[i]=s[i+p](i<=len-p) 解题思路: 其实就是要 ...
- KMP + 求相等前后缀--- POJ Seek the Name, Seek the Fame
Seek the Name, Seek the Fame Problem's Link: http://poj.org/problem?id=2752 Mean: 给你一个字符串,求这个字符串中有多少 ...
- Codeforces Round #545 (Div. 2)D(KMP,最长公共前后缀,贪心)
#include<bits/stdc++.h>using namespace std;const int N=1000007;char s1[N],s2[N];int len1,len2; ...
- 【kmp+求所有公共前后缀长度】poj 2752 Seek the Name, Seek the Fame
http://poj.org/problem?id=2752 [题意] 给定一个字符串,求这个字符串的所有公共前后缀的长度,按从小到达输出 [思路] 利用kmp的next数组,最后加上这个字符串本身 ...
- POJ 2752 Seek the Name, Seek the Fame(KMP求公共前后缀)
题目链接:http://poj.org/problem?id=2752 题目大意:给你一串字符串s找到所有的公共前后缀,即既是前缀又是后缀的子串. 解题思路: 如图所示 假设字符串pi与jq为符合条件 ...
随机推荐
- Java常用设计模式详解1--单例模式
单例模式:指一个类有且仅有一个实例 由于单例模式只允许有一个实例,所以单例类就不可通过new来创建,而所有对象都默认有一个无参的构造函数可以创建对象,所以单例类不仅不能提供public的构造方法,还需 ...
- 容器技术之Docker网络
上一篇博客我们主要聊了下docker镜像相关的说明以及怎样基于现有镜像制作镜像.分发镜像到docker仓库中的相关测试:回顾请参考https://www.cnblogs.com/qiuhom-1874 ...
- PHP 操作结果集对象方法
<?php header('Content-type:text/html;charset=utf-8'); //建立 或者 关闭mysql服务器 @符号用于屏蔽错误信息 $link=@mysql ...
- Python之Flask框架一
flask是一个使用 Python 编写的轻量级 Web 应用框架.轻巧页就意味着他比较简洁,不过见到的MTV框架还是有的,(MVC)但是最重要的还是他的可扩展性很强,对比与Django框架呢,他的灵 ...
- Pandas读取文件报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 0: invalid start byte
pandas读取文件时报UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 0: invalid start by ...
- eatwhatApp开发实战(十三)
这次内容,我们就项目中添加商店名称的EditText进行修改,让添加按钮随着edittext的内容而改变. 上代码,首先是xml文件上对两个控件的修改: <RelativeLayout andr ...
- 错误记录:Data too long for column 'xxx' at row 1
错误记录:Data too long for column 'xxx' at row 1 使用Flask-sqlalchemy操作数据时报错: "Data too long for colu ...
- SpringBoot实现微信小程序登录的完整例子
目录 一.登录流程 二.后端实现 1.SpringBoot项目结构树 2.实现auth.code2Session 接口的封装 3.建立用户信息表及用户增删改查的管理 4.实现登录认证及令牌生成 三.前 ...
- 脚本:Tomcat日志切割
Tomcat日志切割脚本 #!/bin/bash #Tomcat日志切割 Tomcat_logs_path=/data/server/tomcat-8080/logs d=`date +%F` d7= ...
- Rocket - diplomacy - enumerateMask
https://mp.weixin.qq.com/s/s3hr5JJX2_pwNgdu8WqV0Q 介绍enumerateMask的实现.(仅供理解,非严谨证明) 1. 基本定义 ...