传送门:http://poj.org/problem?id=2752
题目描述:要求求出字符串S所有满足如下条件的子串长度(1.子串T为S的前缀 2.子串T为S的后缀)。
解题思路:利用KMP的NEXT数组的特性,Next[pos]的含义是在pos处失配时pos应该指向的下一个位置,那么0-(Next[pos]-1)构成的字符串和(pos-Next[pos])-(pos-1)构成的字符串是相同么,那么即0-(Next[pos]-1)构成的字符串是,0-pos-1构成的字符串的前缀后缀子串,这样,考虑在主串S后面增加一个字符,构成新字符串P,那么求出P最后一个位置的Next[]值,那么就可以按照上述分析来求出前缀后缀子串(PS:要把pos不停的滑动,直到pos=0,因为空串不算是前缀后缀子串)
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const int MAXN = 4111111;
char P[MAXN];
int Next[MAXN],M;
vector<int> ans;
void MakeNext(int M){
int i = 0, j = -1;
Next[0] = -1;
while(i<M){
if(j==-1||P[i]==P[j])Next[++i]=++j;
else j = Next[j];
}
}
int main(){
while(scanf("%s",P)!=EOF){
M = strlen(P);
P[M] = '5';P[++M]=0;
ans.clear();
MakeNext(M);
int pos = M-1;
while(pos){
ans.push_back(pos);
pos = Next[pos];
}
for(int i=(int)ans.size()-1;i>=0;i--){
if(i)printf("%d ",ans[i]);
else printf("%d\n",ans[i]);
}
}
return 0;
}
分享到:
相关推荐
### 数据结构KMP-NEXT数组计算方法 #### KMP算法简介 KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由Donald Knuth、James H. Morris和Vaughan Pratt共同提出。相较于朴素的字符串匹配算法,KMP算法...
pku acm 2752 Seek the Name, Seek the Fame代码 kmp算法。解题报告:http://blog.csdn.net/china8848
下面我们将深入探讨KMP算法及其next数组的求解过程。 首先,我们需要理解KMP算法的基本思想。传统的朴素字符串匹配算法在遇到不匹配时会将模式串回溯到第一个字符,但KMP算法通过next数组避免了这种无效的回溯。当...
本文将深入探讨KMP算法以及其中的"next"数组,同时结合提供的图片资源进行详细解释。 首先,KMP算法是由Donald Knuth、Vaughan Pratt和James Morris三位学者共同提出的。它的核心在于构建一个"next"数组,也称为...
汇编语言实现kmp(next数组升级)
关于字符串匹配里,KMP算法中next实现实现原理。关于字符串匹配里,KMP算法中next实现实现原理。
在KMP算法中,关键的概念是fail数组,也被称为next数组,它存储了模式串的前缀和后缀的最长公共长度,用于指导匹配过程。 fail数组的计算是KMP算法的核心部分,其主要目的是为了构建一个动态跳转表,使得在主串和...
kmp算法 KMP算法是什么? 引用自百度百科: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配...
KMP算法中next数组求法 KMP算法是字符串匹配算法中的一种高效算法,next数组是KMP算法的核心结构。next数组的计算是KMP算法的关键步骤,本文将详细介绍next数组的计算方法。 next数组的定义: next数组的定义为:...
veeam agent for linux (veeamsnap-kmp-default-3.0.2.1185_3.0.101_63-2.1.x86_64)
- POJ 1961、POJ 2406:KMP算法的应用。 ### 其他问题 #### 贪心算法 - **题目示例**: - POJ 3411、POJ 1724:贪心策略的选择与应用。 #### 二分查找 - **题目示例**: - POJ 3373、POJ 1691:二分查找技术的...
现有报告表明,利什曼原虫多诺万尼抗原KMP-11在调节内脏利什曼病(VL)中的免疫应答中可能很重要。 这项研究评估了在感染的BALB / c小鼠中通过鼠类树突细胞针对VL呈递KMP-11抗原的疫苗前景。 我们在这里报告说,通过...
- **平均年龄**(1 练习题):计算一组数据的平均值,理解数组和循环的基本运用。 2. **数值计算**: - **装箱问题**(2.5 例题):涉及动态规划或贪心策略,解决物品分配以最大化装载效率的问题。 - **进制转换...
KMP算法的思想是,通过计算模式串的next数组,来记录模式串中的每个字符所对应的匹配位置。next数组的计算方法是,从头开始,寻找当前位置至开始判断两边的字符重复的个数记录入当前位置的next数组中。 例如,模式...
根据提供的标题、描述以及部分内容,可以确定这是一份关于KMP算法中求解next数组的课程资料。下面将详细介绍KMP算法的基本概念、next数组的作用及其计算方法。 ### KMP算法简介 KMP(Knuth-Morris-Pratt)算法是一...
- 示例题目:poj1191, poj1054, poj3280, poj2029, poj2948, poj1925, poj3034 2. **四边形不等式** - 示例题目:POJ3254, poj2411, poj1185 3. **记忆化搜索** - 示例题目:poj2057, poj1947, poj2486, poj...
内容概要:主要包括KMP中的next数组的实现,属简单了解类型,还包括了KMP算法,以及原码,模版,和手写笔记适用人群:适用于对KMP已经有初步了解,增添思考的一中方案
2. 求解next数组的递推原理:next数组的递推公式是基于当前字符之前的匹配情况和已经计算的next值来确定的。如果当前字符前的某个前缀与后缀相等,则当前字符的next值就是这个相等的前缀的最后一个字符的next值加一...