码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj2251

时间:2015-06-30 17:53:19      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:

以前看到这道题想到的是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

 

bzoj2251

标签:

原文地址:http://www.cnblogs.com/phile/p/4610985.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!