返回一个字符串循环移位后的字典序最小的起始位置

1
2
3
4
5
6
7
8
9
10
11
12
13
int find(string s)
{
int i,j,k,l,N = s.length(); s += s;
for(i=0,j=1;j < N;)
{
for(k=0;k<N && s[i+k] == s[j+k];++k);
if(k >= N) break;
if(s[i+k]<s[j+k]) j += k+1;
else l=i+k,i=j,j=max(l,j)+1;
}
// cout << s.substr(i,N) << '\n';
return i;
}