[洛谷]P1368工艺-最小表示法

题目

题目
题目大意:

给定一个序列,求其最小表示发法。

题解

裸的模板题,\(O(n)\)线性时间即可解。

#include <iostream>

using namespace std;
const int N=6E5+10;
int n,a[N],ans;

int main() {
	cin>>n;
	for(int i=0;i<n;i++) {
		cin>>a[i];
		a[i+n]=a[i];
	}
	n--;
	int i=1,j=2,k;
	while(i<=n and j<=n) {
		for(k=0;k<n and a[i+k]==a[j+k];k++);
		if(k==n)
		  break;
		if(a[i+k]>a[j+k]) {
			i=i+k+1;
			if(i==j)
			  i++;
		}
		else {
			j=j+k+1;
			if(i==j)
			  j++;
		}
	}
	ans=min(i,j);   //求出最小表示的初始位置
	for(int i=ans;i<=ans+n;i++)
	  cout<<a[i]<<' ';
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/wyc06/p/12698383.html
今日推荐