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

      比较裸的后缀数组。

    /**************************************************************
        Problem: 1031
        User: BLADEVIL
        Language: Pascal
        Result: Accepted
        Time:808 ms
        Memory:5304 kb
    ****************************************************************/
     
    //By BLADEVIL
    var
        s, str                  :array[0..200010] of char;
        n, m, l                 :longint;
        i                       :longint;
        ws, wv                  :array[0..200010] of longint;
        w                       :array[0..200010,0..1] of longint;
        r, sa                   :array[0..200010] of longint;
          
    procedure da;
    var
        i, j, p, k1, k2         :longint;
    begin
        for i:=0 to m do ws[i]:=0;
        for i:=0 to n do
        begin
            w[i][0]:=r[i];
            inc(ws[r[i]]);
        end;
        for i:=1 to m do inc(ws[i],ws[i-1]);
        for i:=n downto 0 do
        begin
            dec(ws[w[i][0]]);
            sa[ws[w[i][0]]]:=i;
        end;
         
        j:=1; p:=1;
        k1:=0; k2:=1;
        while p<=n do
        begin
            p:=0; i:=n-j+1;
            while i<=n do
            begin
                w[p][k2]:=i;
                inc(p);
                inc(i);
            end;
            for i:=0 to n do
                if sa[i]>=j then
                begin
                    w[p][k2]:=sa[i]-j;
                    inc(p);
                end;
             
            for i:=0 to n do wv[i]:=w[w[i][k2]][k1];
            for i:=0 to m do ws[i]:=0;
            for i:=0 to n do inc(ws[wv[i]]);
            for i:=1 to m do inc(ws[i],ws[i-1]);
            for i:=n downto 0 do
            begin
                dec(ws[wv[i]]);
                sa[ws[wv[i]]]:=w[i][k2];
            end;
             
            k1:=k1 xor 1; 
            k2:=k2 xor 1;
            p:=1;
            w[sa[0]][k1]:=0;
            for i:=1 to n do
            begin
                if (w[sa[i-1]][k2]=w[sa[i]][k2]) and (w[sa[i-1]+j][k2]=w[sa[i]+j][k2]) then
                    w[sa[i]][k1]:=p-1 else
                    begin
                        w[sa[i]][k1]:=p;
                        inc(p);
                    end;
            end;
            j:=j<<1; m:=p;
        end;
          
    end;
          
    begin
        n:=0;
        while not eoln do
        begin
            read(str[n]);
            inc(n);
        end;
        l:=n; dec(n);
        s:=str;
        for i:=n+1 to 2*n+1 do s[i]:=str[i-n-1];
        n:=2*n+2;
        s[n]:=chr(1);
        for i:=0 to n do
        begin
            r[i]:=ord(s[i]);
            if r[i]>m then m:=r[i];
        end;
        da;
        for i:=0 to n do
            if sa[i]<l then write(s[sa[i]+l-1]);
        writeln;
    end.
     
  • 相关阅读:
    OC
    OC
    OC
    OC
    OC
    Oracle wm_concat()函数
    字符串拼接
    easyui扩展数据表格点击加号拓展
    子tab里面新增tab(top.jQuery)
    combox datagrid重复请求问题
  • 原文地址:https://www.cnblogs.com/BLADEVIL/p/3531483.html
Copyright © 2011-2022 走看看