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);
}