ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

题解-P2852 [USACO06DEC]牛奶模式Milk Patterns

2019-06-09 11:03:37  阅读:196  来源: 互联网

标签:const USACO06DEC Patterns int 题解 ht ++ && include


SA+单调队列,太简单了就放在这里吧。

#include<iostream>
#include<cstdio>
using namespace std;
const int N=2e4+4;
const int M=1e6+6;

int t1[N],t2[N],c[M];
int sa[N],rk[N],ht[N];
int a[N];

void gtsa(int n,int m){
    int *x=t1,*y=t2;
    int i,j,p=0;
    for(i=1;i<=n;i++)
        ++c[x[i]=a[i]];
    for(i=1;i<=m;i++)
        c[i]+=c[i-1];
    for(i=n;i;i--)
        sa[c[x[i]]--]=i;
    for(j=1;j<=n&&p<n;j<<=1){
        p=0;
        for(i=n-j+1;i<=n;i++)
            y[++p]=i;
        for(i=1;i<=n;i++)
            if(sa[i]>j)
                y[++p]=sa[i]-j;
        for(i=0;i<=m;i++)
            c[i]=0;
        for(i=1;i<=n;i++)
            ++c[x[y[i]]];
        for(i=1;i<=m;i++)
            c[i]+=c[i-1];
        for(i=n;i;i--)
            sa[c[x[y[i]]]--]=y[i];
        swap(x,y);
        p=1;
        x[sa[1]]=1;
        for(i=2;i<=n;i++)
            x[sa[i]]=y[sa[i]]==y[sa[i-1]]&&y[sa[i]+j]==y[sa[i-1]+j]?p:++p;
        m=p;
    }
    for(i=1;i<=n;i++)
        rk[sa[i]]=i;
    p=0;
    a[n+1]=-1;
    for(i=1;i<=n;i++){
        j=sa[rk[i]-1];
        if(p)--p;
        while(a[i+p]==a[j+p])
            ++p;
        ht[rk[i]]=p;
    }
}

int main()
{
    int n,m,i;
    scanf("%d%d",&n,&m);
    if(m==1){
        printf("%d",n);
        return 0;
    }
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
    gtsa(n,M-1);
    int s=1,t=0,ans=0;
    for(i=1;i<m;i++){
        while(t>=s&&ht[c[t]]>ht[i])
            --t;
        c[++t]=i;
    }
    for(i=m;i<=n;i++){
        while(t>=s&&ht[c[t]]>ht[i])
            --t;
        c[++t]=i;
        while(c[s]+m-1<=i)
            ++s;
        ans=max(ans,ht[c[s]]);
    }
    printf("%d",ans);
    return 0;
}

 

标签:const,USACO06DEC,Patterns,int,题解,ht,++,&&,include
来源: https://www.cnblogs.com/wanghaoyu/p/Solution1.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有