字符串:abcdabcdabce
其未优化next数组:-1 0 0 0 0 1 2 3 4 5 6 7
最长公共前后缀: 0 0 0 0 1 2 3 4 5 6 7 0
最长公共前后缀和特征值有很大关系,可以发现是求出其特征值的同时,如果此时有p[i]==p[k],则最长公共前后缀的为next数组的值加一,反之则为零。

说明:子符串的前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串;后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串。例如对于字符串 abacaba,其前缀有 a, ab, aba, abac, abacab,后缀有bacaba, acaba, caba, aba, ba, a。最长公共前后缀就是 aba。现给出一个长度为 N 的字符串 S,对于每个 M (0<=M<N),求出连续子串 S[0…M] 的最长公共前后缀。
输入格式:
输入数据仅有一行,包含一个长度不超过 100,000 的仅由字母 a-z 构成的字符串。
输出格式:
对于每个 M (0,1,2,…,N−1),输出对应的最长公共前后缀长度,以空格分隔,且行尾不得有多余空格。
输入样例:

abcdabcdabce

输出样例:

0 0 0 0 1 2 3 4 5 6 7 0

实现代码

#include<iostream>
#include<string.h>
using namespace std;
int* findpresuffix(char* p)
{    int i = 0,k = 0;   int l = strlen(p);    int* same = new int[l];    same[i] = 0;    while (i < l)    {   i++;        while (k >0  && p[i] != p[k])      k = same[k-1];  //其特征值为前一位if (p[i] == p[k])//最长公共前后缀包含本身字符如果相同则加1  {            k++;           same[i] = k;      }       else            same[i] = 0; //不相同则没有公共前后缀  }    return same;}
int main(){    char p[100001];    cin >> p;    int l = strlen(p);    int* m = findpresuffix(p);    if (l > 0)        cout << m[0];    for (int i = 1; i < l; i++)   {  cout << " " << m[i];    }   return 0;}

后面是我的一个未通过PTA测试的版本但是测试了很多可以正常输出
希望有大佬可以指出一些细节性的错误
代码如下

#include<string.h>
using namespace std;
int* findpresuffix(char* p)
{int i = 0, k = -1;int l = strlen(p);int* same = new int[l];same[i] = -1;while (i < l - 1){while (k >= 0 && p[i] != p[k])k = same[k];i++;k++;same[i] = k;}for (i = 0; i < l; i++){if (p[same[i]] == p[i])same[i]++;elsesame[i] = 0;}return same;
}
int main()
{char p[100001];cin >> p;int l = strlen(p);int* m = findpresuffix(p);if (l > 0)cout << m[0];for (int i = 1; i < l; i++){cout << " " << m[i];}return 0;
}

7-1 最长公共前后缀相关推荐

  1. 7-3 最长公共前后缀

    字符串的前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串:后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串.例如对于字符串 abacaba,其前缀有 a, ab, aba, aba ...

  2. 7-3 最长公共前后缀

    字符串的前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串:后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串.例如对于字符串 abacaba,其前缀有 a, ab, aba, aba ...

  3. 最长公共前后缀(KMP中next数组求法)

    字符串的前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串:后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串.例如对于字符串 abacaba,其前缀有 a, ab, aba, aba ...

  4. KMP算法及next数组(最大公共前后缀)求解

    KMP算法及next数组(最大公共前后缀)求解 2020.12.14理解: 1. KMP算法 网上关于KMP算法讲解较为简单易懂,因此在此只作简述: 在字符串s中匹配字符串t: S: ABE-AB-A ...

  5. 北大OJ百练——4073:最长公共字符串后缀(C语言)

    刚刚看到一道北大的OJ题,很简单的一道题.原题如下(偷个懒,直接截图): 看完这道题,我想大家都和我一样觉得这道题很简单,事实也是如此,毕竟通过率很高. 我先来说一下我的思路吧.我是想先把这些所有的字 ...

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

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

  7. Bailian4073 最长公共字符串后缀【文本处理】

    4073:最长公共字符串后缀(Longest String Postfix) 总时间限制: 1000ms 内存限制: 65536kB 描述 给出若干个字符串,输出这些字符串的最长公共后缀. 输入 由若 ...

  8. 最长公共子串_两个字符串的最长公共子串(后缀自动机)

    // 最长公共子序列(后缀自动机) typedef struct state {int len, link;map<char, int> next; }state;const int MA ...

  9. Kmp算法之 求最大公共前后缀

    先抛问题1:如果我们已知一个字符str的最大公共前后缀长度,当这个str再添加一个字符的str2,如何判断这个新的str2的最大公共前后缀长度?? 结论:只要将新添加的字符,与str的最大公共前后缀中 ...

最新文章

  1. windows下的eclipse运行hdfs程序时报错 (null) entry in command string: null chmod 0644【笔记自用】
  2. 让人郁闷的“DesktopCompatible”
  3. JFinal整合CKFinder
  4. Pgbouncer 介绍
  5. css中的单位换算_金蝶ERP入门教程:动态换算率及辅助计量单位的应用
  6. html字符串变量,字符串变量中的Python HTML
  7. android rtsp 延时,ijkplayer 单视频流直播延迟问题解决过程
  8. nsdictionary获取值_objective-c – 在NSDictionary中获取值
  9. Flash Player版本相关问题
  10. 实现链表的增删改查java代码_用Java语言实现链表的增删改查
  11. 系统集成项目管理工程师历年案例考试汇总
  12. PMP/PRINCE2/IPMP/软考,主流项目管理认证对比
  13. 分销系统的用户关系数据库设计~
  14. 弗洛伊德、荣格、阿德勒
  15. bzoj3168 钙铁锌硒维生素 (矩阵求逆+二分图最小字典序匹配)
  16. Joel Spolsky对计算机学生的建议
  17. java里面怎么开根号_新手求解呀!!!!!!!怎么开根号,为嘛我开不了
  18. M1芯片电脑安装cerebro
  19. 浅析网站 APP 登录界面设计
  20. C4K Power supply failed?

热门文章

  1. 阿里p7程序员:生活压力大,有房贷不敢离职,离职股票就没了
  2. android 展示大图,Android 加载超大图(原图)分析
  3. uniapp文字无缝滚动
  4. 判断本机IP地址是公网地址还是私网地址
  5. jQuery 学习-DOM篇(四):jQuery 删除 DOM 元素的方法
  6. “之“字形打印矩阵(Java)
  7. DB2使用db2advis工具调优SQL
  8. Java基础编程\第四-六章(面向对象编程)
  9. tomcat7介绍(一)
  10. 浏览器网站请求全解析