【BZOJ1717】[Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组+二分)

11人阅读 评论(0) 收藏 举报
分类:

题目

传送门

题解

求重复至少k次的最长子串长度(可重叠)
求出sa数组和height数组之后,二分出一个长度,判断height数组中大于这个值的数是否有k个

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=2000001;

int n,k,m=200,s[maxn],x[maxn],y[maxn],c[maxn],sa[maxn],rnk[maxn],height[maxn];

void build_sa()
{
    for (int i=0; i<m; i++) c[i]=0;
    for (int i=0; i<n; i++) c[x[i]=s[i]]++;
    for (int i=1; i<m; i++) c[i]+=c[i-1];
    for (int i=n-1; i>=0; i--) sa[--c[x[i]]]=i;

    for (int k=1; k<=n; k<<=1)
    {
        int p=0;
        for (int i=n-k; i<n; i++) y[p++]=i;
        for (int i=0; i<n; i++) if (sa[i]>=k) y[p++]=sa[i]-k;

        for (int i=0; i<m; i++) c[i]=0;
        for (int i=0; i<n; i++) c[x[i]]++;
        for (int i=1; i<m; i++) c[i]+=c[i-1];
        for (int i=n-1; i>=0; i--) sa[--c[x[y[i]]]]=y[i];

        swap(x,y);
        p=1; height[sa[0]]=0;
        for (int i=0; i<n; i++)
            x[sa[i]] = y[sa[i-1]]==y[sa[i]] && ((sa[i-1]+k>=n?-1:y[sa[i-1]+k])==(sa[i]+k>=n?-1:y[sa[i]+k])) ? p-1:p++;
        if (p>n) break;
        m=p;
    }
}

void build_height()
{
    for (int i=0; i<n; i++) rnk[sa[i]]=i;
    int k=0; height[0]=0;
    for (int i=0; i<n; i++)
    {
        if (!rnk[i]) continue;
        if (k) k--;
        int j=sa[rnk[i]-1];
        while (i+k<n && j+k<n && s[i+k]==s[j+k]) k++;
        height[rnk[i]]=k;
    }
}

bool check(int x)
{
    int tot=1;
    for (int i=0; i<n; i++)
        if (height[i]>=x)
        {
            tot++;
            if (tot==k) return true;
        }
        else tot=1;
    return false;
}

int main()
{
    scanf("%d%d",&n,&k);
    for (int i=0; i<n; i++) scanf("%d",&s[i]);
    build_sa();
    build_height();
    int l=1,r=n;
    while (l<r)
    {
        int mid=(l+r)>>1;
        if (check(mid)) l=mid+1;
        else r=mid;
    }
    printf("%d",l-1);
    return 0;
}

总结

注意height数组的应用,二分在这里比较常用

查看评论

bzoj 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)

1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 903  Solved:...
  • clover_hxy
  • clover_hxy
  • 2016-05-11 17:45:15
  • 416

bzoj1717 [Usaco2006 Dec]Milk Patterns 产奶的模式 后缀数组 论文题

这题是罗大神的论文题= =求重复k次的最长子串。 求出height以后二分判断或者单调队列都是可以的,我选择二分w。 实力诠释一波眼瞎,判断一个n打成n-1调了半天。。#include #incl...
  • qq_35866453
  • qq_35866453
  • 2017-06-04 16:07:59
  • 128

1717: [Usaco2006 Dec]Milk Patterns 产奶的模式

1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 952  Solve...
  • CRZbulabula
  • CRZbulabula
  • 2016-08-10 17:51:17
  • 453

bzoj1717: [Usaco2006 Dec]Milk Patterns 产奶的模式[后缀数组]题解②

1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1011  Solv...
  • qq_34564984
  • qq_34564984
  • 2016-12-14 14:48:18
  • 167

[BZOJ1717][Usaco2006 Dec]Milk Patterns 产奶的模式(后缀数组)

错过的年华在北漠开出斑斓的紫薇花,却荒芜了轮回的春夏。
  • Clove_unique
  • Clove_unique
  • 2016-05-11 19:12:09
  • 690

BZOJ1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 后缀数组

1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1064  Solv...
  • Oakley_
  • Oakley_
  • 2017-01-12 17:05:21
  • 401

后缀数组——Luogu2852 [USACO06DEC]牛奶模式Milk Patterns

题面:Luogu2852 题目就是让我们求在串s中出现至少k次的最长子串c 首先Height这个性质还是要用:lcp(x,y)=min(Height[rank[x]]~Height[rank[y]...
  • jzq233jzq
  • jzq233jzq
  • 2017-06-09 21:02:28
  • 291

bzoj1717[Usaco2006 Dec]Milk Patterns 产奶的模式 (二分+hash)题解①

1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 993  Solved:...
  • qq_34564984
  • qq_34564984
  • 2016-12-14 11:05:28
  • 375

BZOJ1717: [Usaco2006 Dec]Milk Patterns 产奶的模式

题目链接离散化后后缀数组。若将模式串看为最长公共前缀,即是求原串中K个后缀的最长公共前缀。易知若要前缀最长,则K个串的首位置的rank值必定连续,即这k个串的首位置为sa[i]~sa[i+k-1] (...
  • Ep1C_HeReT1c
  • Ep1C_HeReT1c
  • 2017-01-17 15:08:15
  • 94

[bzoj1717][Usaco2006 Dec]Milk Patterns 产奶的模式

后缀数组
  • youhavepeople
  • youhavepeople
  • 2017-07-29 10:43:30
  • 149
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 2005
    排名: 2万+
    博主是个蒟蒻
    最新评论