大致题意:
给出一个字符串,求出其第一个最小表示和最大表示的位置,并分别求出最小表示的个数和最大表示的个数。
大致思路:
最小表示法+KMP扩展出的最小重复子串,一顿乱搞即可。本来打算用后缀数组,但是看数据量达到了1000000,还是作罢了~~囧
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int nMax=1000005;
char pat[nMax];
int lenp,next[nMax];
void get_next(){
int i,j=-1;
next[0]=-1;
for(i=1;i<=lenp;i++){ //pat[j]是不是可以理解为i的前一个字符的next值所指想的字符
while(j>-1&&pat[j+1]!=pat[i])j=next[j];
if(pat[j+1]==pat[i])j++;
next[i]=j;
}
}
//最小表示
int minexp(char *s,int x) {
int i=0,j=1,k=0,t;
while(i<x&&j<x&&k<x) {
t=s[(i+k)%x]-s[(j+k)%x];
if(t==0) k++;
else {
if(t>0) i+=k+1;
else j+=k+1;
if(i==j) j++;
k=0;
}
}
return i<j?i:j;
}
//最大表示
int maxexp(char *s,int x) {
int i=0,j=1,k=0,t;
while(i<x&&j<x&&k<x) {
t=s[(i+k)%x]-s[(j+k)%x];
if(t==0) k++;
else {
if(t<0) i+=k+1; //这里是区别
else j+=k+1;
if(i==j) j++;
k=0;
}
}
return i<j?i:j;
}
int main(){
int ans,i,j,a,b;
while(scanf("%s",pat)!=EOF){
lenp=strlen(pat);
get_next();
a=minexp(pat,lenp);
b=maxexp(pat,lenp);
int l=(lenp-1)-next[lenp-1];
if(lenp%l==0){
ans=lenp/l;//cout<<lenp/l<<endl;;
}
else{
ans=1;//printf("1\n");
}
printf("%d %d %d %d\n",a+1,ans,b+1,ans);
}
return 0;
}
//h 3374
分享到:
相关推荐
最小表示法,也被称为Morris-Pratt算法或者KMP预处理,是计算机科学中解决字符串匹配问题的一种高效方法。这个方法由C.A.R. Hoare在1968年首次提出,后来由Morris和Pratt进行了改进,主要用于优化Boyer-Moore算法和...
- **模式匹配**:朴素贝叶斯算法和KMP算法,用于在文本中寻找子串出现的位置。 - **字符串排序**:suffix array和Burrows-Wheeler变换,高效处理字符串集合。 6. **习题解答**: 提供的`.solution.pdf`文件包含...
最小表示法是一种在字符串处理和算法竞赛中不太常见但非常经典的思想,主要用于解决字符串的循环同构问题。在本文中,我们将深入探讨最小表示法及其在解决特定问题上的应用。 循环同构指的是两个字符串可以通过有限...
C++实现的KMP算法是一种在字符串中查找子串出现位置的高效算法,由Knuth、Morris和Pratt在1970年提出。KMP算法的核心在于避免了不必要的字符比较,通过预处理得到一个“部分匹配表”,在主串和模式串的匹配过程中,...
《KMP算法详解——C++实现》 KMP(Knuth-Morris-Pratt)算法是一种在字符串中高效查找子串出现位置的模式匹配算法,由Donald Knuth、James H. Morris和 Vaughan R. Pratt三位学者于1970年代提出。这个算法的关键...
**KMP算法详解** KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由D.E. Knuth、V.R. Morris和J.H. Pratt于1977年提出。它解决了在一个主串(文本串)中查找一个模式串(目标串)的问题,避免了在匹配...
print(kmp_search(s, p)) # 输出:0,表示"hello"在s中的起始位置 ``` 总结来说,KMP算法是一种高效、避免回溯的字符串匹配算法,它通过构建部分匹配表实现了对字符串匹配的优化,广泛应用于多种IT领域。理解和掌握...
3. **C++实现**:在VS2005平台上,C++代码通常会包括头文件`<iostream>`和`<string>`,并使用`std::string`来表示字符串。主要函数可能包含两个,一个是构造部分匹配表,另一个是实际的匹配函数。构造部分匹配表的...
KMP(Knuth-Morris-Pratt)算法是一种在文本字符串中查找子串出现位置的高效算法,由Donald Knuth、Vaughan Pratt和James H. Morris三人于1970年代提出。这个算法避免了在匹配过程中频繁的回溯,通过构建一个“部分...
KMP(Knuth-Morris-Pratt)算法是解决这个问题的一种高效方法,尤其适用于在长字符串中查找重复或特定的子串。 KMP算法是由D.E. Knuth、V.R. Morris和J.H. Pratt三位学者在1970年代提出的。它的核心思想是避免了在...
原字符串、被替换的字符串和替换的字符串都可以用`std::string`对象表示。 要实现字符替换功能,我们可以使用`std::string`的`find()`和`replace()`成员函数。`find()`函数用于查找字符串中指定子串的位置,返回第...
void KMP(const std::string &text, const std::string &pattern) { std::vector<int> lps = computeLPS(pattern); int index = 0, textIndex = 0; while (textIndex ()) { if (pattern[index] == text[text...
最后,为了方便与其他类型的对象进行转换,我们可以提供`toStdString()`(返回std::string)和`fromStdString(const std::string&)`(从std::string创建String)函数: ```cpp std::string toStdString() const { ...
《文学研究助手——深入解析KMP算法在字符串查找与模式匹配中的应用》 在文学研究领域,高效地处理文本信息是至关重要的。本项目“文学研究助手”正是为解决这一问题而设计,它利用C语言实现,核心算法是著名的KMP...
int COUNT_KMP(const std::string &S, const std::string &T) { std::vector<int> next(T.size()); NEXT(T, next); int index = 0, count = 0; while (index ()) { int pos = 0; while (pos () && index ()) {...
bool KMP(const std::string& text, const std::string& pattern) { std::vector<int> prefix(pattern.size()); computePrefixFunction(prefix, pattern); int i = 0, j = 0; while (i () && j ()) { if (text...
总结来说,本学习教案通过介绍和分析最小表示法思想以及枚举算法、模式匹配算法和KMP算法等,在字符串循环同构问题中的应用,帮助学习者建立起对这一问题的深刻理解,并提高解决实际问题的能力。通过本教案的学习,...
本文档是一份PPT学习教案,旨在指导学习者通过最小表示法来应对字符串循环同构问题。 循环同构,顾名思义,是指在对字符串执行循环移位操作后能够得到另一个字符串的情况。例如,字符串"s1 = 'a b c d'"经过一次...
int KMP(const std::string& text, const std::string& pattern) { std::vector<int> lps(pattern.size()); computeLPS(lps, pattern); int i = 0, j = 0; while (i () && j ()) { if (text[i] == pattern[j])...
3. **KMP (Knuth-Morris-Pratt) 算法**:KMP算法的核心在于构造一个部分匹配表,这个表记录了模式串中每个前缀和后缀的最大公共长度。利用这个表,当发生不匹配时,我们可以知道下一个应该匹配的字符,无需回溯。KMP...