定义#
最小表示法是用于解决字符串最小表示问题的方法。
循环同构#
当字符串
则称
最小表示#
字符串
算法核心#
考虑对于一对字符串
不妨先考虑
所以我们比较时可以跳过下标
这样,我们就完成了对于暴力的优化。
时间复杂度#
过程#
- 初始化指针
为 , 为 ;初始化匹配长度 为 - 比较第
位的大小,根据比较结果跳转相应指针。若跳转后两个指针相同,则随意选一个加一以保证比较的两个字符串不同 - 重复上述过程,直到比较结束
- 答案为
中较小的一个
实现#
int n,a[300005];
int main(){
n=read();
for(int i = 0;i< n;i++) a[i]=read();
int i = 0,j = 1,k = 0;
while(i<n&&j<n&&k<n){
if(a[(i+k)%n]==a[(j+k)%n])k++;
else{
a[(i+k)%n]>a[(j+k)%n]? i=i+k+1:j=j+k+1;
if(i==j)i++;
k=0;
}
}
i = min(i,j);
for(int cnt=1;cnt<=n;cnt++){
cout<<a[i]<<" ";
i=(i+1)%n;
}
return 0;
}cpp
Comments
View on GitHub