zoukankan      html  css  js  c++  java
  • bzoj2251

    以前看到这道题想到的是SA,做起来不是很美观

    学了SAM之后,这题简直是随便搞

     1 var go:array[0..6010,'0'..'1'] of longint;
     2     s,sa,mx,w,fa:array[0..6010] of longint;
     3     i,n,last,t:longint;
     4     ch:char;
     5 
     6 procedure add(c:char);
     7   var p,np,nq,q:longint;
     8   begin
     9     p:=last;
    10     inc(t); np:=t; last:=t;
    11     mx[np]:=mx[p]+1;
    12     w[np]:=1;
    13     while (p>0) and (go[p,c]=0) do
    14     begin
    15       go[p,c]:=np;
    16       p:=fa[p];
    17     end;
    18     if p=0 then fa[np]:=1
    19     else begin
    20       q:=go[p,c];
    21       if mx[q]=mx[p]+1 then fa[np]:=q
    22       else begin
    23         inc(t); nq:=t;
    24         mx[nq]:=mx[p]+1;
    25         go[nq]:=go[q];
    26         fa[nq]:=fa[q];
    27         fa[q]:=nq; fa[np]:=nq;
    28         while go[p,c]=q do
    29         begin
    30           go[p,c]:=nq;
    31           p:=fa[p];
    32         end;
    33       end;
    34     end;
    35   end;
    36 
    37 procedure pre;
    38   var i,x:longint;
    39   begin
    40     for i:=1 to t do
    41       inc(s[mx[i]]);
    42     for i:=1 to n do
    43       inc(s[i],s[i-1]);
    44     for i:=t downto 1 do
    45     begin
    46       sa[s[mx[i]]]:=i;
    47       dec(s[mx[i]]);
    48     end;
    49     for i:=t downto 1 do
    50     begin
    51       x:=sa[i];
    52       inc(w[fa[x]],w[x]);
    53     end;
    54   end;
    55 
    56 procedure dfs(x:longint);
    57   var y:longint;
    58       c:char;
    59   begin
    60     for c:='0' to '1' do
    61       if go[x,c]>0 then
    62       begin
    63         if w[go[x,c]]>1 then writeln(w[go[x,c]]);
    64         dfs(go[x,c]);
    65       end;
    66   end;
    67 
    68 begin
    69   readln(n);
    70   t:=1; last:=1;
    71   for i:=1 to n do
    72   begin
    73     read(ch);
    74     add(ch);
    75   end;
    76   pre;
    77   dfs(1);
    78 end.
    View Code
  • 相关阅读:
    linux启动流程
    树-二叉平衡树AVL
    算法导论第六章 堆排序
    算法导论基础(第一~五章)
    树-二叉查找树
    Java:基础
    【转】为什么C++编译器不能支持对模板的分离式编译
    压缩和解压缩命令
    Makefile编程
    1.什么是Mybatis?
  • 原文地址:https://www.cnblogs.com/phile/p/4610985.html
Copyright © 2011-2022 走看看