zoukankan      html  css  js  c++  java
  • [bzoj2251][2010BeiJing Wc]外星联络_后缀数组

    外星联络 bzoj-2251 2010-BeiJing Wc

    题目大意题目链接

    注释:略。


    想法

    这咋做啊????一看数据范围才$3cdot 10^3$。

    建立后缀数组。

    所以我们将所有后缀排序后,每个后缀的$ht[i]+1$的位置显然这个子串是第一次出现。

    我们统计每个子串第一次出现的位置然后统计有多少个即满足题意。

    那么如何统计呢?我们只需要想后枚举到第一个$ht_j>ht_i$的即可因为$ht$有传递性。

    Code:

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    #define N 3050
    int n,ws[N],wv[N],wa[N],wb[N],sa[N],m=3,r[N];
    int rank[N],height[N];
    char str[N];
    void build_sa()
    {
        int i,j,p,*x=wa,*y=wb,*t;
        for(i=0;i<m;i++) ws[i]=0;
        for(i=0;i<n;i++) ws[x[i]=r[i]]++;
        for(i=1;i<m;i++) ws[i]+=ws[i-1];
        for(i=n-1;i>=0;i--) sa[--ws[x[i]]]=i;
        for(j=p=1;p<n;j<<=1,m=p)
    	{
            for(p=0,i=n-j;i<n;i++) y[p++]=i;
            for(i=0;i<n;i++) if(sa[i]-j>=0) y[p++]=sa[i]-j;
            for(i=0;i<n;i++) wv[i]=x[y[i]];
            for(i=0;i<m;i++) ws[i]=0;
            for(i=0;i<n;i++) ws[wv[i]]++;
            for(i=1;i<m;i++) ws[i]+=ws[i-1];
            for(i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i];
            for(t=x,x=y,y=t,x[sa[0]]=0,p=i=1;i<n;i++)
    		{
                if(y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+j]==y[sa[i]+j]) x[sa[i]]=p-1;
                else x[sa[i]]=p++;
            }
        }
        for(i=1;i<n;i++) rank[sa[i]]=i;
        for(i=p=0;i<n-1;height[rank[i++]]=p)
            for(p?p--:0,j=sa[rank[i]-1];r[i+p]==r[j+p];p++);
    }
    int main()
    {
        scanf("%d",&n);
        scanf("%s",str);
        int i,j,k;
        for(i=0;i<n;i++) r[i]=str[i]-'0'+1;
        n++;
        build_sa();
        for(i=1;i<=n;i++)
    	{
            for(j=height[i]+1;sa[i]+j-1<n;j++)
    		{
                for(k=i+1;height[k]>=j&&k<=n;k++) ;
                if(k-i>1) printf("%d
    ",k-i);
            }
        }
    }
    

    小结:好好玩~$ht$数组的应用是一般后缀数组的考察点之一。

  • 相关阅读:
    知识要点
    SQL语法(包括建库、建表、建视图、查询、增加、删除、修改)
    SQL语句(建库、建表、修改语句)
    比较好的电影网站
    crud创建,修改,删除,查询
    代码创建与操作数据库
    数据库
    数组与集合
    结构体
    类的运用
  • 原文地址:https://www.cnblogs.com/ShuraK/p/10108967.html
Copyright © 2011-2022 走看看