kmp-51nod 1277 字符串中的最大值

https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1277
首先求前缀,那么你要想到kmp;
我们算出next数组(即p[])后,可以理解为包含关系;
即前缀i包含前缀p[i];
我们搞一个sum[i]表示前缀长度为i的前缀出现过几次;
显然初始值sum[i]=1;
我们倒着推,边推边算答案,就好了;
注意sum[]会爆int;

#include<iostream>
#include<cstdio>
#include<cstring>
#define Ll long long
using namespace std;
string s;
Ll p[100005],sum[100005];
Ll n,m;
Ll ans;
void make(string s){
    p[1]=0;
    for(int i=2;i<=m;i++){
        int j=p[i-1];
        while(j&&s[j+1]!=s[i])j=p[j];
        if(s[j+1]==s[i])j++;
        p[i]=j;
    }
}
int main()
{
    cin>>s;
    m=s.length(); s=' '+s;
    make(s);
    for(int i=m;i;i--)sum[i]=1;
    for(int i=m;i;i--){
        ans=max(ans,sum[i]*i);
        sum[p[i]]+=sum[i];
    }
    printf("%lld",ans);
}
    原文作者:KMP算法
    原文地址: https://blog.csdn.net/largecub233/article/details/62039957
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞