搞了一下最小表示法~~
具体就是一个字符串首位相连成一个环,然后问从哪里断开它的字典序最小
暴力做法就是枚举。O(N^2);
优化一下
第一种优化,把每种可能的字符串列出来,然后qsort
O(Nlogn) 但由于是字符串比较,所以常数会有点大;
接下来介绍一种O(N)的算法~
i,j是两个指针 i表示当前找到的最优解 j表示要试探的
初始i=1 j=2
如果s[i]>s[j],那么就把i更新成j
如果s[i]<s[j],那么j找下一位
具体就是一个字符串首位相连成一个环,然后问从哪里断开它的字典序最小
暴力做法就是枚举。O(N^2);
优化一下
第一种优化,把每种可能的字符串列出来,然后qsort
O(Nlogn) 但由于是字符串比较,所以常数会有点大;
接下来介绍一种O(N)的算法~
i,j是两个指针 i表示当前找到的最优解 j表示要试探的
初始i=1 j=2
如果s[i]>s[j],那么就把i更新成j
如果s[i]<s[j],那么j找下一位
如果s[i]=s[j],则。。见程序吧,,懒得说了。。
function ans(s:string):longint;
var ni,nj,i,j,k:longint;
begin
i:=1; j:=2; k:=0;
while ((i<=length(s)) and (j<=length(s)) and (k<length(s))) do
begin
if i=j then inc(i);
ni:=(i+k-1) mod length(s)+1;
nj:=(j+k-1) mod length(s)+1;
if s[ni]>s[nj] then begin
inc(i,k+1);
k:=0;
end;
if s[ni]<s[nj] then begin
inc(j,k+1);
k:=0;
end;
if s[ni]=s[nj] then inc(k);
end;
exit(i);
end;