• 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
    ",ans);
        return 0;
    }

     

  • 相关阅读:
    php上传文件大小修改
    flex布局
    restful
    mysql之windows忘记密码
    mysql常用命令
    比较级浅析1
    一般副词的位子
    still讲解
    英语学习法
    as的如下用法
  • 原文地址:https://www.cnblogs.com/Never-mind/p/9770654.html
Copyright © 2020-2023  润新知