【最小表示法】BZOJ2882-工艺

【题目大意】

求一个循环数列的最小表示法。

【思路】

最小表示法模板题。之前用SAM做的,MLE了hhhhh戳

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int MAXN=300000+50;
 7 int s[MAXN*2],n;
 8 
 9 void init()
10 {
11     scanf("%d",&n);
12     for (int i=0;i<n;i++)
13     {
14         scanf("%d",&s[i]);
15         s[i+n]=s[i];
16     } 
17 }
18 
19 void solve()
20 {
21     int i=0,j=1,k=0;
22     while (k<n)
23     {
24         int t=s[(i+k)%(2*n)]-s[(j+k)%(2*n)];//不要忘记了这里要mod
25         if (t==0) k++;
26         else
27         {
28             if (t>0) i+=k+1;
29                 else j+=k+1;
30             if (i==j) j++;
31             k=0;
32         }
33     }
34     for (int r=1,now=i;r<=k;r++,now=(now+1)%(2*n)) 
35     {
36         printf("%d",s[now]);
37         if (r!=k) printf(" ");
38     }
39 }
40 
41 int main()
42 {
43     init();
44     solve();
45     return 0;
46 }

 

posted @ 2016-08-14 18:17  iiyiyi  阅读(243)  评论(0编辑  收藏  举报