zoukankan      html  css  js  c++  java
  • 后缀数组

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <algorithm>
     6 using namespace std;
     7 #define maxn 100005
     8 int n,m,tot,t1[maxn],t2[maxn],Rank[maxn],sa[maxn],hei[maxn],sum[maxn];
     9 char st[maxn];
    10 int main(){
    11     scanf("%s",st+1),n=strlen(st+1);
    12     int *x=t1,*y=t2;
    13     m=256;
    14     for (int i=1;i<=m;i++) sum[i]=0;
    15     for (int i=1;i<=n;i++) sum[x[i]=st[i]]++;
    16     for (int i=1;i<=m;i++) sum[i]+=sum[i-1];
    17     for (int i=n;i>=1;i--) sa[sum[x[i]]--]=i;
    18     for (int len=1,tot=0;tot<n;len<<=1,m=tot){
    19         tot=0;
    20         for (int i=n-len+1;i<=n;i++) y[++tot]=i;
    21         for (int i=1;i<=n;i++) if (sa[i]>len) y[++tot]=sa[i]-len;
    22         for (int i=1;i<=m;i++) sum[i]=0;
    23         for (int i=1;i<=n;i++) sum[x[i]]++;
    24         for (int i=1;i<=m;i++) sum[i]+=sum[i-1];
    25         for (int i=n;i>=1;i--) sa[sum[x[y[i]]]--]=y[i];
    26         swap(x,y),tot=0;
    27         x[sa[1]]=++tot;
    28         for (int i=2;i<=n;i++){
    29             if (y[sa[i]]!=y[sa[i-1]]||y[sa[i]+len]!=y[sa[i-1]+len]) ++tot;
    30             x[sa[i]]=tot;
    31         }
    32     }
    33     for (int i=1;i<=n;i++) Rank[i]=x[i];
    34     memset(hei,0,sizeof(hei));
    35     for (int i=1,j=0;i<=n;i++){
    36         if (Rank[i]==1) continue;
    37         while (st[i+j]==st[sa[Rank[i]-1]+j]) j++;
    38         hei[Rank[i]]=j;
    39         if (j) j--;
    40     }
    41     for (int i=1;i<=n;i++) printf("%d
    ",sa[i]);
    42     return 0;
    43 }
    View Code

    后缀数组模板。

  • 相关阅读:
    Embed标签中的symbol的作用
    loader的右键菜单不响应
    使用[frame()]数据标签制作的纯AS preLoader
    REST是什么(转)
    Ruby on Rails
    Ruby on Rails 数据库连接及mysql乱码
    Ruby On Rails——安装
    Asp.net mvc 3 beta 新特性介绍
    使用 Git 管理源代码
    Asp.net发送邮件的两种方法
  • 原文地址:https://www.cnblogs.com/OYzx/p/5679592.html
Copyright © 2011-2022 走看看