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

bzoj1031题解

时间:2017-03-05 12:34:19      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:end   ring   顺序   typedef   splay   display   begin   pen   name   

【解题思路】

  将原串复制一份拼接到原串后作为处理串,可以对处理串的前一半后缀排序,即可得出顺序。复杂度O(Llog2L)。

【参考代码】

  也是naive的时候写的。。后缀数组居然是用桶排求的。。

技术分享
 1 #pragma optimize(2)
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <vector>
 5 #define REP(I,start,end) for(int I=(start);I<=(end);I++)
 6 #define PER(I,start,end) for(int I=(start);I>=(end);I--)
 7 using namespace std;
 8 typedef vector<int> vecint;
 9 vecint srt[100010];
10 int suffix[100010],rank[100010],srnk[100010];
11 char st[100010];
12 int main()
13 {
14     scanf("%s",st);
15     int n=strlen(st);
16     memset(srt,0,sizeof(srt));
17     REP(i,1,n)
18         srt[st[i-1]].push_back(i);
19     int cnt=0,tot=0;
20     REP(i,0,255)
21         if(!srt[i].empty())
22         {
23             cnt++;
24             for(vecint::iterator it=srt[i].begin();it!=srt[i].end();it++)
25             {
26                 int now=*it;
27                 suffix[++tot]=now;
28                 rank[now]=cnt;
29             }
30         }
31     for(int i=1;i<n;i<<=1)
32     {
33         memset(srt,0,sizeof(srt));
34         REP(j,1,n)
35         {
36             int now=i+j;
37             now-=(now>n)*n;
38             srt[rank[now]].push_back(j);
39         }
40         tot=cnt=0;
41         REP(j,0,n)
42             if(!srt[j].empty())
43             {
44                 cnt++;
45                 for(vecint::iterator it=srt[j].begin();it!=srt[j].end();it++)
46                 {
47                     int now=*it;
48                     suffix[++tot]=now;
49                     srnk[now]=cnt;
50                 }
51             }
52         memset(srt,0,sizeof(srt));
53         REP(j,1,n)
54             srt[rank[suffix[j]]].push_back(suffix[j]);
55         cnt=tot=0;
56         REP(j,0,n)
57             if(!srt[j].empty())
58             {
59                 int last=-1;
60                 for(vecint::iterator it=srt[j].begin();it!=srt[j].end();it++)
61                 {
62                     int now=*it,pnt=srnk[now];
63                     cnt+=pnt>last;
64                     last=pnt;
65                     suffix[++tot]=now;
66                     rank[now]=cnt;
67                 }
68             }
69     }
70     REP(i,1,n)
71         putchar(st[(suffix[i]+n-2)%n]);
72     putchar(\n);
73     return 0;
74 }
View Code

 

bzoj1031题解

标签:end   ring   顺序   typedef   splay   display   begin   pen   name   

原文地址:http://www.cnblogs.com/spactim/p/6504792.html

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