POJ - 2752

问题分析:

读懂题后知道,这个题要算的是,给定一个字符串s,有哪些长度的s的前缀,同时也是s的后缀。

首先明确一下前缀和后缀的概念。字符串s的前缀是指,从s的开始字符到s的任意字符为止的子串。字符串s的后缀是指,从s的任意字符到s的最后字符为止的子串。s是既是自身的前缀也是自身的后缀。

这个问题利用KMP算法的next[]数组来解。首先对于输入的字符串s,计算其next[]数组。然后,根据next[]数组的值进行进一步的计算。

还需要知道的是next[]数组的定义。对于字符串s的第i个字符s[i],next[i]定义为字符s[i]前面最多有多少个连续的字符和字符串s从初始位置开始的字符匹配。

从后到前匹配前缀和后缀。如果前缀与后缀匹配,则下一个前缀与后缀匹配的字符串只能在前缀中。

KMP算法:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <ctype.h>
#include <cstring>
#include <cstdio>
#include <sstream>
#include <cstdlib>
#include <iomanip>
#include <string>
#include <queue>
#include <map>using namespace std;
const int maxn=1e6+10;
int Next[maxn],sum[maxn];
char str[maxn],mo[maxn];//str是主串,mo是模串
int t,n,m;void getNext()//递推next数组
{int i=0,j=-1,len=strlen(mo);while(i<len){if(j==-1||mo[i]==mo[j])Next[++i]=++j;else{j=Next[j];}}
}
/*nt kmp()
{int i=0,j=0,l1=strlen(str),l2=strlen(mo);int ans=0;while(i<l1){if(j==-1||mo[j]==str[i])i++,j++;elsej=Next[j];if(j==l2){j=0;ans++;}}return ans;
}*/int main()
{while(scanf("%s",mo)!=EOF){Next[0]=-1;getNext();int len=strlen(mo),k=0;for(int i=len;i!=0;){sum[k++]=Next[i];i=Next[i];}for(int i=k-2;i>=0;--i)printf("%d ",sum[i]);printf("%d\n",len);}return 0;
}

Hash算法:

思路:暴力枚举每个前缀,判断与回缀的哈希值是否相等。

#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long#define  LL long long
const int maxn=1000010;
ull base =131;char T[maxn];
ull g[maxn];
ull p[maxn];ull Hash(char s[])
{int len=strlen(s);ull ans=0;g[0]=s[0];for(int i=1;i<len;i++){g[i]=g[i-1]*base+s[i];}return g[len-1];
}void getp()
{p[0]=1;for(int i=1;i<=maxn;i++){p[i]=p[i-1]*base;}
}ull getLR(int l, int r)//取出T里l - r里面的字符串的hash值
{return g[r]-g[l-1]*p[r-l+1];
}int main()
{getp();while(~scanf("%s",T)){Hash(T);int n=strlen(T), ans=0;for(int i=1;i<=n;i++){ull p1=getLR(0, i-1);ull p2=getLR(n-i,n-1);if(p1==p2){printf("%d ",i);}}printf("\n");}return 0;
}

Seek the Name, Seek the Fame POJ - 2752(KMP和hah两种方法求公共前后缀)相关推荐

  1. Seek the Name, Seek the Fame POJ - 2752(KMP应用)

    Stringland有一只小猫非常有名,许多夫妇跋涉到Stringland请小猫为他们的新出生的婴儿起名字,他们寻求这个名字,同时寻求名声.为了摆脱这种无聊的工作,创新的小猫制定了一个简单而奇妙的算法 ...

  2. Seek the Name, Seek the Fame POJ - 2752 (理解KMP函数的失配)既是S的前缀又是S的后缀的子串

    题意:给一个字符串S, 求出所有前缀pre,使得这个前缀也正好是S的后缀. 输出所有前缀的结束位置. 就是求前缀和后缀相同的那个子串的长度  然后从小到大输出,主要利用next数组求解. 例如 &qu ...

  3. Seek the Name, Seek the Fame - POJ 2752(next运用)

    题目大意:小猫是非常有名气的,所以很多父母都来找它给孩子取名字,因为找的人比较多,小猫为了摆脱这个无聊的工作,于是它发明了一种取名字的办法,它把孩子父母的名字合在一起,然后从这个名字里面找一个前缀,并 ...

  4. POJ 3461 还是两种方法

    上午我用了Rabin-Karp算法做的.基本的数据可以测试通过,但是一提交就WA.偶滴天啊,我不知道错在哪啊..我是非专业的..呜呜.找了半天找不出.算了.看人家都是用KMP做的,那我下午就用KMP写 ...

  5. poj 1129 也算是遍历的吧 两种方法

    我当时是不懂题目是什么意思的,看了别人的才知道原来是所谓的四色问题.我也不知道是什么东东,查了才懂.要学的还有很多呢!太弱了.关键把结构存储进去后,每次遍历它的邻接节点.并把用的颜色标记下来.然后再每 ...

  6. POJ 4151/北大百练 4151 电影节 题解(两种方法)贪心算法基础

    POJ4151 电影节 总时间限制: 1000ms 内存限制: 65536kB 描述: 大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看( ...

  7. KMP Seek the Name,Seek the Fame

    Seek the Name,Seek the Fame 时间限制: 1 Sec 内存限制: 128 MB 题目描述 给定一个字符串s,从小到大输出s中既是前缀又是后缀的子串的长度. 字符串长度不超过四 ...

  8. KMP POJ 2752 Seek the Name, Seek the Fame

    题目传送门 1 /* 2 题意:求出一个串的前缀与后缀相同的字串的长度 3 KMP:nex[]就有这样的性质,倒过来输出就行了 4 */ 5 /**************************** ...

  9. 【hash】Seek the Name, Seek the Fame

    [哈希和哈希表]Seek the Name, Seek the Fame 题目描述 The little cat is so famous, that many couples tramp over ...

  10. Seek the Name, Seek the Fame(KMP-next数组详解)

    Seek the Name, Seek the Fame 目录 Seek the Name, Seek the Fame 解题过程 举个例子 AC代码 The little cat is so fam ...

最新文章

  1. 机器学习进阶-图像形态学操作-腐蚀操作 1.cv2.erode(进行腐蚀操作)
  2. C++非类型模板参数
  3. 基于hi-nginx的web开发(python篇)——路由装饰器
  4. 网页魔法菜单(使用说明)
  5. 在日期上加上相应天数,并在GridView上显示
  6. ubuntu下MySQL的安装
  7. SPOJ - DQUERY D-query(莫队/线段树+离线/主席树)
  8. Hyperledger Fabric学习笔记(二)- Fabric 2.2.1环境搭建
  9. 精心整理,kafka常见面试题,看这篇文章就够了(共17题,含详细解答)
  10. python文件拆分_python – 在几个文件中拆分views.py.
  11. StringUtils 方法介绍(转载)
  12. 【创建型】Prototype模式
  13. LAMMPS分子动力学模拟技术及应用
  14. Python Roberts算子、Sobel算子——举例说明 ^_^
  15. Keil出现Error:Flash Download failed - Could not load file
  16. 斐讯路由器宽带运营商服务器,新版斐讯p.to路由器的设置教程
  17. 计算机职业生涯规划书素材,2021大学生职业生涯规划书素材模板
  18. 好多粉如何统计微信加粉复制次数?
  19. 用Excel PS 汽车人标志
  20. Java编程之实现数字化的连连看

热门文章

  1. java定义全局变量_java全局变量
  2. 魔兽争霸平台显示服务器地址错误,发现(魔兽争霸出现错误的解决方法)
  3. 反引号在linux中的作用
  4. PHP实现站点pv,uv统计(一)
  5. 代码签名证书有哪些产品
  6. 1991【19CSPS提高组】树的重心 信奥赛Kirito(本人)
  7. python利用you-get下载视频
  8. 苹果摄像头黑屏_报道称苹果已将折叠 iPhone 送往测试/苹果官网上线送份好礼,送到心里页面/iPhone 12 mini 拆解报告公布...
  9. 2018百度之星初赛(A) 1003、1002、1001
  10. 修改Chrome浏览器默认背景颜色为浅绿色