`
暴风雪
  • 浏览: 389013 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

[KMP+最小表示法]hdoj 3374:String Problem

阅读更多

大致题意:

    给出一个字符串,求出其第一个最小表示和最大表示的位置,并分别求出最小表示的个数和最大表示的个数。

 

大致思路:
    最小表示法+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
1
0
分享到:
评论

相关推荐

    最小表示法

    最小表示法,也被称为Morris-Pratt算法或者KMP预处理,是计算机科学中解决字符串匹配问题的一种高效方法。这个方法由C.A.R. Hoare在1968年首次提出,后来由Morris和Pratt进行了改进,主要用于优化Boyer-Moore算法和...

    【电子版】算法设计 中文版+英文版+习题 作者: [美]克菜因伯格 / 塔多斯

    - **模式匹配**:朴素贝叶斯算法和KMP算法,用于在文本中寻找子串出现的位置。 - **字符串排序**:suffix array和Burrows-Wheeler变换,高效处理字符串集合。 6. **习题解答**: 提供的`.solution.pdf`文件包含...

    最小表示法,周源ppt

    最小表示法是一种在字符串处理和算法竞赛中不太常见但非常经典的思想,主要用于解决字符串的循环同构问题。在本文中,我们将深入探讨最小表示法及其在解决特定问题上的应用。 循环同构指的是两个字符串可以通过有限...

    c++ KMP 算法

    C++实现的KMP算法是一种在字符串中查找子串出现位置的高效算法,由Knuth、Morris和Pratt在1970年提出。KMP算法的核心在于避免了不必要的字符比较,通过预处理得到一个“部分匹配表”,在主串和模式串的匹配过程中,...

    KMP.rar_H.R.H.

    《KMP算法详解——C++实现》 KMP(Knuth-Morris-Pratt)算法是一种在字符串中高效查找子串出现位置的模式匹配算法,由Donald Knuth、James H. Morris和 Vaughan R. Pratt三位学者于1970年代提出。这个算法的关键...

    KMP.rar_KMP算法_java KMP_kmp string_kmp string tutorial_算法

    **KMP算法详解** KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,由D.E. Knuth、V.R. Morris和J.H. Pratt于1977年提出。它解决了在一个主串(文本串)中查找一个模式串(目标串)的问题,避免了在匹配...

    KMP-suanfa.rar_kmp string

    print(kmp_search(s, p)) # 输出:0,表示"hello"在s中的起始位置 ``` 总结来说,KMP算法是一种高效、避免回溯的字符串匹配算法,它通过构建部分匹配表实现了对字符串匹配的优化,广泛应用于多种IT领域。理解和掌握...

    最小表示法在字符串循环同构问题中的应用PPT学习教案.pptx

    "最小表示法在字符串循环同构问题中的应用PPT学习教案" ...本资源是关于字符串循环同构问题的学习教案,涵盖了循环同构的定义、枚举算法、匹配算法、KMP算法和最小表示法等内容,为学习者提供了系统的学习资源。

    KMP算法实现,语言C++

    3. **C++实现**:在VS2005平台上,C++代码通常会包括头文件`&lt;iostream&gt;`和`&lt;string&gt;`,并使用`std::string`来表示字符串。主要函数可能包含两个,一个是构造部分匹配表,另一个是实际的匹配函数。构造部分匹配表的...

    KMP算法实现的C++代码

    KMP(Knuth-Morris-Pratt)算法是一种在文本字符串中查找子串出现位置的高效算法,由Donald Knuth、Vaughan Pratt和James H. Morris三人于1970年代提出。这个算法避免了在匹配过程中频繁的回溯,通过构建一个“部分...

    数据结构(C语言)--模式匹配--KMP算法

    KMP(Knuth-Morris-Pratt)算法是解决这个问题的一种高效方法,尤其适用于在长字符串中查找重复或特定的子串。 KMP算法是由D.E. Knuth、V.R. Morris和J.H. Pratt三位学者在1970年代提出的。它的核心思想是避免了在...

    字符替换:简单的字符串替换程序,需要三个参数,原字符串,被替换的字符串,替换的字符串

    原字符串、被替换的字符串和替换的字符串都可以用`std::string`对象表示。 要实现字符替换功能,我们可以使用`std::string`的`find()`和`replace()`成员函数。`find()`函数用于查找字符串中指定子串的位置,返回第...

    KMP.rar_pattern match

    void KMP(const std::string &text, const std::string &pattern) { std::vector&lt;int&gt; lps = computeLPS(pattern); int index = 0, textIndex = 0; while (textIndex ()) { if (pattern[index] == text[text...

    String实例

    最后,为了方便与其他类型的对象进行转换,我们可以提供`toStdString()`(返回std::string)和`fromStdString(const std::string&)`(从std::string创建String)函数: ```cpp std::string toStdString() const { ...

    文学研究助手(字符串的查找\模式匹配\KMP算法)

    《文学研究助手——深入解析KMP算法在字符串查找与模式匹配中的应用》 在文学研究领域,高效地处理文本信息是至关重要的。本项目“文学研究助手”正是为解决这一问题而设计,它利用C语言实现,核心算法是著名的KMP...

    完全掌握KMP算法思想

    int COUNT_KMP(const std::string &S, const std::string &T) { std::vector&lt;int&gt; next(T.size()); NEXT(T, next); int index = 0, count = 0; while (index ()) { int pos = 0; while (pos () && index ()) {...

    字符串的模式匹配算法——KMP

    bool KMP(const std::string& text, const std::string& pattern) { std::vector&lt;int&gt; prefix(pattern.size()); computePrefixFunction(prefix, pattern); int i = 0, j = 0; while (i () && j ()) { if (text...

    算法合集之浅析最小表示法思想在字符串循环同构问题中的应用PPT学习教案.pptx

    本资源是关于字符串循环同构问题的算法合集学习教案,主要讲解了如何使用最小表示法思想来解决字符串循环同构问题。通过对问题的分析和解释,学习者可以了解如何使用最小表示法思想来解决问题,并且可以了解枚举算法...

    KMP.zip_C++_KMP

    int KMP(const std::string& text, const std::string& pattern) { std::vector&lt;int&gt; lps(pattern.size()); computeLPS(lps, pattern); int i = 0, j = 0; while (i () && j ()) { if (text[i] == pattern[j])...

    串匹配算法c++实现string matching algorithm

    3. **KMP (Knuth-Morris-Pratt) 算法**:KMP算法的核心在于构造一个部分匹配表,这个表记录了模式串中每个前缀和后缀的最大公共长度。利用这个表,当发生不匹配时,我们可以知道下一个应该匹配的字符,无需回溯。KMP...

Global site tag (gtag.js) - Google Analytics