【最小表示法】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 }