[KMP fail树] 51nod1277 字符串中的最大值

来源:互联网 发布:黑手党 知乎 编辑:程序博客网 时间:2024/06/07 06:02

题意

对于一个字符串 S,定义 S 的一个前缀的权值为:前缀长度× 在S中的出现次数。求最大权值。

题解

fail 树的简单运用。
一个点所代表的前缀的出现次数=在 fail 树上以这个点为根的子树大小。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=100005;typedef long long LL;int n,nxt[maxn],sz[maxn];LL ans;char s[maxn];int main(){    freopen("51nod1277.in","r",stdin);    freopen("51nod1277.out","w",stdout);    scanf("%s",s+1); n=strlen(s+1);    for(int i=2,j=0;i<=n;i++){        while(j&&s[j+1]!=s[i]) j=nxt[j];        if(s[j+1]==s[i]) j++;        nxt[i]=j;     }    for(int i=n;i>=1;i--){        sz[i]++; ans=max(ans,(LL)sz[i]*i);         sz[nxt[i]]+=sz[i];    }    printf("%lld\n",ans);    return 0;} 
原创粉丝点击