KMP算法的玄妙应用。
对于起点不为0,终点为i的字符串,如果可以利用d[i]将其对应到起点为0的相等的字符串上。
#include <bits/stdc++.h>
using namespace std;
const int MAXN=100100;
char s[MAXN];
int f[MAXN],d[MAXN];
void KMP()
{
int i,j,len=strlen(s);
d[0]=-1; i=-1; j=0;
while(j<=len)
{
if(i==-1||s[i]==s[j])
{
i++;
j++;
d[j]=i;
}
else
i=d[i];
}
}
int main()
{
long long len,i,ans;
while(~scanf("%s",&s))
{
KMP();
len=strlen(s);
memset(f,0,sizeof(f));
for(i=len;i>1;i--)
{
f[i]++;
f[d[i]]+=f[i];
}
ans=0;
for(i=1;i<=len;i++)
ans=max(ans,i*f[i]);
printf("%lld\n",ans);
}
}