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最小前后缀】的更多相关文章

  1. HDU 3613 Best Reward(扩展KMP求前后缀回文串)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3613 题目大意: 大意就是将字符串s分成两部分子串,若子串是回文串则需计算价值,否则价值为0,求分割 ...

  2. 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 ...

  3. HDU 2594(求最长公共前后缀 kmp)

    题意是在所给的两个字符串中找最长的公共前后缀,即第一个字符串前缀和第二个字符串后缀的最长相等串. 思路是将两个字符串拼接在一起,然后直接套用 kmp 算法即可. 要注意用 next 会报编译错误,改成 ...

  4. HDU 4763 Theme Section(KMP+枚举公共前后缀)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4763 题目大意: 给你一个字符串s,存在一个子串E同时出现在前缀.中间.后缀,即EAEBE这种模式,A ...

  5. FZU 1901 Period II(KMP循环节+公共前后缀)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1901 题目大意:题目大意求出所有p满足s[i]=s[i+p](i<=len-p) 解题思路: 其实就是要 ...

  6. KMP + 求相等前后缀--- POJ Seek the Name, Seek the Fame

    Seek the Name, Seek the Fame Problem's Link: http://poj.org/problem?id=2752 Mean: 给你一个字符串,求这个字符串中有多少 ...

  7. 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; ...

  8. 【kmp+求所有公共前后缀长度】poj 2752 Seek the Name, Seek the Fame

    http://poj.org/problem?id=2752 [题意] 给定一个字符串,求这个字符串的所有公共前后缀的长度,按从小到达输出 [思路] 利用kmp的next数组,最后加上这个字符串本身 ...

  9. POJ 2752 Seek the Name, Seek the Fame(KMP求公共前后缀)

    题目链接:http://poj.org/problem?id=2752 题目大意:给你一串字符串s找到所有的公共前后缀,即既是前缀又是后缀的子串. 解题思路: 如图所示 假设字符串pi与jq为符合条件 ...

随机推荐

  1. C语言基础知识(二)——二维数组

    二维数组本质 二维数组本质就是一维数组,只不过**形式是二维**,类似矩阵,使用二维数组表示会更加形象. 二维数组实例 float rain[5][12]; //内含5个数组元素的数组,每个数组元素内 ...

  2. Htop/Glances/Dstat性能测试系统监控工具领域的瑞士军刀

    原文链接:https://mp.weixin.qq.com/s/TvfzIy4uXHPOFQ1h5Q4KWg 建议点击原文链接查看 续上篇分享的[性能测试工具],今天整理了常用的系统监控工具,当然有特 ...

  3. SQL——SQL日期

    SQL日期    MySQL:        NOW() 返回当前的日期和时间        CURDATE() 返回当前的日期        CURTIME() 返回当前的时间        DAT ...

  4. 利用SQL语句替换织梦DedeCms数据库内容

    找到 然后把命令放在 执行即可,慎重执行 替换文章标题 UPDATE `dede_archives` SET `title`=replace(title,'我我我','你你你') 替换文章正文 UPD ...

  5. element-ui上传组件,通过自定义请求上传文件

    记录使用element-ui上传组件,通过自定义请求上传文件需要注意的地方. <el-upload ref="uploadMutiple" :auto-upload=&quo ...

  6. [wordpress使用]004_导入多媒体

    在写文章的时候难免要需要用到图片.音频或者视频文件,wordpress不仅提供本地上传多媒体文件功能,更提供在线导入多媒体.能更方便,范围更大的获取我们所需要的资源. 本地上传文件 在写文章的界面,选 ...

  7. 50个SQL语句(MySQL版) 问题五

    --------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...

  8. MyBatis主配置文件

    MyBatis的使用非常简单,使用流程整体可以分成以下四步: public class UserDaoTest { private SqlSessionFactory sqlSessionFactor ...

  9. Rocket - tilelink - RegisterRouter

    https://mp.weixin.qq.com/s/DaJhf7hEoWsEi_AjwSrOfA   简单介绍RegisterRouter的实现.   ​​   1. 基本介绍   实现挂在Tile ...

  10. js运算符和if语句,switch语句

    逻辑运算符 类型 运算符 算数运算符 +   -    *   /   %   ++   -- 赋值运算符 = 比较运算符 >   <   >=  <=   ==   !=   ...