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

    https://blog.csdn.net/qq_35640373/article/details/70168683

     1 //hdu 3518
     2 #include <iostream>
     3 #include <string.h>
     4 #include <stdlib.h>
     5 #include <cmath>
     6 #define LL long long
     7 using namespace std;
     8 
     9 #define maxn 1020
    10 int max(int x,int y){ return x>y?x:y;}
    11 int min(int x,int y){ return x<y?x:y;}
    12 int wa[maxn],wb[maxn],wv[maxn],WS[maxn];
    13 
    14 int cmp(int *r,int a,int b,int l){
    15     return r[a]==r[b]&&r[a+l]==r[b+l];
    16 }
    17 
    18 void da(int *r,int *sa,int n,int m){
    19     int i,j,p,*x=wa,*y=wb,*t;
    20     for(i=0;i<m;i++) WS[i]=0;
    21     for(i=0;i<n;i++) WS[x[i]=r[i]]++;
    22     for(i=1;i<m;i++) WS[i]+=WS[i-1];
    23     for(i=n-1;i>=0;i--) sa[--WS[x[i]]]=i;
    24     for(j=1,p=1;p<n;j*=2,m=p){
    25         for(p=0,i=n-j;i<n;i++) y[p++]=i;
    26         for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
    27         for(i=0;i<n;i++) wv[i]=x[y[i]];
    28         for(i=0;i<m;i++) WS[i]=0;
    29         for(i=0;i<n;i++) WS[wv[i]]++;
    30         for(i=1;i<m;i++) WS[i]+=WS[i-1];
    31         for(i=n-1;i>=0;i--) sa[--WS[wv[i]]]=y[i];
    32         for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)
    33             x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
    34     }
    35     return;
    36 }
    37 
    38 int Rank[maxn],height[maxn];
    39 
    40 void calheight(int *r,int *sa,int n){
    41     int i,j,k=0;
    42     for(i=1;i<=n;i++) Rank[sa[i]]=i;
    43     for(i=0;i<n;height[Rank[i++]]=k)
    44         for(k?k--:0,j=sa[Rank[i]-1];r[i+k]==r[j+k];k++);
    45     return;
    46 }
    47 
    48 int r[maxn],sa[maxn];
    49 char s[maxn];
    50 
    51 int ok(int k,int n){
    52     int i,j,ret=0;
    53     int maxx,minx;
    54     maxx=-1;
    55     minx=9999999;
    56     for(i=1;i<=n;i++){
    57         if(height[i]>=k)//分组满足大于k的
    58         {
    59             maxx=max(maxx,sa[i]);
    60             minx=min(minx,sa[i]);
    61         }
    62         else
    63         {
    64             if(maxx-minx>=k)//之前满足条件就要+1;
    65                 ret++;
    66             maxx=sa[i];
    67             minx=sa[i];
    68         }
    69     }
    70     if(maxx-minx>=k)
    71         ret++;
    72     return ret;
    73 }
    74 
    75 int main(){
    76     int i,j;
    77     while(cin>>s){
    78         if(s[0]=='#') break;
    79         int len=strlen(s);
    80         for(i=0;i<len;i++)
    81             r[i]=s[i];
    82         r[len]=0;
    83         da(r,sa,len+1,123);
    84         calheight(r,sa,len);
    85         LL ans=0;
    86         for(i=1;i<len;i++){
    87             ans+=ok(i,len);
    88         }
    89         cout<<ans<<endl;
    90     }
    91     return 0;
    92 }
  • 相关阅读:
    【设计模式】3、工厂方法模式
    【设计模式】2、生成器模式(建造者模式)
    【设计模式】1、抽象工厂模式
    UNION 和UNION ALL
    树的遍历
    相关前台跨域的解决方式
    有关this指针指向问题
    有关箭头函数
    深入理解js的变量提升和函数提升
    linux tail 命令详解
  • 原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/9562917.html
Copyright © 2011-2022 走看看