• KMP中next数组的应用


    KMP算法中,求了一个前缀函数: 为前  个字符组成的子串中、真前缀、真后缀相等的最大长度。
    例如对于abcabcd

    1. a,,没有真前后缀。
    2. ab,
    3. abc,
    4. abca,
    5. abcab,
    6. abcabc,
    7. abcabcd,

    那么对于给出的字符串求  数组后,前后缀相等的最大长度即为 
    并且只要途中出现过 ,就说明途中出现了一次与前后缀相同的字符串。

    除此之外的一个坑点: 可能大于所有 ,因此出现此种情况时缩短所取前后缀的长度: ,直到存在 
    如果缩短后 ,说明无解。

    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN=200005;
    int Next[MAXN];
    char str[MAXN],vis[MAXN],strf[MAXN];
    int cnt;
    int getFail(char *p,int plen){
        Next[0]=0,Next[1]=0;
        for(int i=1;i<plen;i++){
            int j=Next[i];
            while(j&&p[i]!=p[j]) j=Next[j];
            Next[i+1]=(p[i]==p[j])?j+1:0;
        }
        return 0; 
    }
    
    int main(){
            scanf("%s",str);
            int n=strlen(str);
            getFail(str,strlen(str));
            for(int i=1;i<strlen(str);i++)vis[Next[i]]=1;
            int temp=Next[n];
            while(temp){
                if(vis[temp]){
                    for(int i=0;i<temp;i++){
                        cout<<str[i];
                    }
                    return 0;
                }
                else{
                    temp=Next[temp];
                }
            }
            
            return 0; 
    }
    rush!
  • 相关阅读:
    Java 自动装箱与拆箱(Autoboxing and unboxing)【转】
    工厂方法和new
    java线程池【转】
    大型网站架构演化过程
    jsp el表达式
    GC垃圾回收
    mysql语句
    String StringBuilder StringBuffer
    粉丝关注数据库表的设计
    ECharts图表之柱状折线混合图
  • 原文地址:https://www.cnblogs.com/LH2000/p/13298325.html
Copyright © 2020-2023  润新知