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

【传送门:51nod-1277


简要题意:

  给出一个长度为n的字符串,求出所有前缀的出现的次数*长度的最大值


题解:

  一开始想着直接用KMP做,但是发现解决不了一个问题

  改用EXKMP求,对于一个p[i],若p[i]不为0,则说明1到p[i]的位置的前缀出现的次数都多了一次

  然后用差分搞一下就行了


参考代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
int p[110000];
char st[110000];
LL s[110000];
int main()
{
    int len;
    scanf("%s",st+1);
    len=strlen(st+1);
    p[1]=len;
    int x=1;
    while(st[x]==st[x+1]&&x<=len) x++;
    p[2]=x-1;
    if(p[2]!=0) s[1]++,s[p[2]+1]--;
    int k=2;
    for(int i=3;i<=len;i++)
    {
        int pp=k+p[k]-1,L=p[i-k+1];
        if(i+L<pp+1) p[i]=L;
        else
        {
            int j=pp-i+1;
            if(j<0) j=0;
            while(st[j+1]==st[i+j]&&i+j<=len) j++;
            p[i]=j;
            k=i;
        }
        if(p[i]!=0)
        {
            s[1]++;s[p[i]+1]--;
        }
    }
    LL ans=0;
    for(int i=1;i<=len;i++)
    {
        s[i]+=s[i-1];
        ans=max(ans,(s[i]+1)*LL(i));
    }
    printf("%lld\n",ans);
    return 0;
}

 

posted @ 2018-10-11 09:32  Star_Feel  阅读(212)  评论(0编辑  收藏  举报