• 后缀数组


    定义三个概念:

    sa[i]:字典序排名第i位的是谁

    rank[i]:第i位的字典序排名

    height[i]:排名为i的字符串与前一名的最长前缀

    关于sa的求法:

    关于height的求法:

    当h[i-1]>1时,我们不妨设suffix(k) 为”abcee…”suffix(i-1)为 “abdee…”,前后对照可知它们的最长公共前缀长度为2,那我们现在来考虑suffix(i)=”bdee”,那么排在它前面的是哪一个呢,其实我们不得而知,但是我们知道一个下界,suffix(k+1)=”bcee” 已经给我们提供了一个下界。

    代码:

     

    #include <bits/stdc++.h>
    using namespace std;
    #define maxn 1000010
    int x[maxn],y[maxn],sa[maxn],height[maxn],
    rank[maxn],c[maxn],a[maxn];
    char s[maxn];
    int n,m;
    void asa(int n,int m)
    {
      int p=0,f=0;
      for (int i=1;i<=m;i++) c[i]=0;
      for (int i=1;i<=n;i++) c[x[i]=a[i]]++;
      for (int i=1;i<=m;i++) c[i]+=c[i-1];
      for (int i=n;i;i--) sa[c[x[i]]--]=i;
      for(int i=1;i<=n&&p<=n;i<<=1)
      {
         p=0;
         for (int j=n-i+1;j<=n;j++) y[++p]=j;
         for (int j=1;j<=n;j++) 
           if (sa[j]>i) y[++p]=sa[j]-i;
         for (int j=1;j<=m;j++) c[j]=0;
         for (int j=1;j<=n;j++) c[x[y[j]]]++;
         for (int j=1;j<=m;j++) c[j]+=c[j-1];
         for (int j=n;j;j--) sa[c[x[y[j]]]--]=y[j];
         swap(x,y); x[sa[1]]=1; p=2;
         for (int j=2;j<=n;j++)
           x[sa[j]]=y[sa[j]]==y[sa[j-1]]&&y[sa[j]+i]==y[sa[j-1]+i]
           ?p-1:p++;
         m=p;
      } 
      for (int i=1;i<=n;i++) rank[sa[i]]=i;
      for (int i=1;i<=n;i++)
      {
        int j=sa[rank[i]-1];
        if (f) f--;
        while (a[i+f]==a[j+f]) f++;
        height[rank[i]]=f;
      }
    }
    int lcp(int a,int b)
    {  
      int x=rank[a],y=rank[b];
      if (x>y) swap(x,y); x++;
      int z=log2(y-x+1);
      return(min(bz[z][x],bz[z][y-(1<<z)+1]));
    } 
    int main()
    {
      cin>>s;
      int len=strlen(s);
      for (int i=0;i<len;i++) a[++n]=s[i]-' ';
      asa(n,n);
      for (int i=1;i<=n;i++) cout<<sa[i]<<" ";
      return 0;
    }

     修改 3.7 m大小应与n相同

  • 相关阅读:
    关于字符编码
    cocosbuilder中使用字体描边时,字符重叠,间距过小问题
    2dx关于js响应layer触摸消息的bug
    关于js-binding中Layer触摸事件的优化
    2dx解析cocosbuilder中使用layer时的缺陷
    关于 2dx v3.7 UIScale9Sprite的bug
    c++11 Chrono时间库
    cocos2d-x lua table数据存储
    cocos2d-x lua 使用ListView
    Oracle数据库impdp时ora-00439:未启用功能:Deferred Segment Creation
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/8454361.html
Copyright © 2020-2023  润新知