【學習筆記】最小表示法
阿新 • • 發佈:2019-01-01
-
用途
給定一個長度為n,可旋轉的字串環,求從哪個位置斷開的長度為n的字串字典序最小/大(以最小為例,最大同理)
-
演算法描述
- 令i=0,j=1表示最小的字串可能的位置;
- 找到一個k使得s[i+1]==s[j+1],s[i+2]==s[j+2] ,..., s[i+k-1]==s[j+k-1] ;
- 但是s[i+k]!=s[j+k];
- 如果此時s[i+k]<s[j+k],對於j' = j + 1 到 j + k 的位置一定不是最優解,因為i+j'-j位置的串一定比j'位置的更優且如果i+j'-j 位置的串更優一定會被i選到,那麼就j=j+k+1
- s[i+k]>s[j+k]就i=i+k+1,注意i==j時要再向後移動一位
-
複雜度
- 每多匹配一位k,i或j移動的次數就會相應多一位,所以O(n)
- bzoj1398
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<queue> 6 #include<cmath> 7 #include<vector> 8 #include<stack> 9 #include<map> 10 #include<set
bzoj1398