题目链接:https://cn.vjudge.net/problem/POJ-1509
最小表示法:判断头尾详解的字符串最小的字典序是从第几个字符串开始的。
具体思路:线性的,我们设立两个下表,然后设立一个变量len。
首先令i=0,j=1,len=0;
一开始,我们比较s[i+len]和s[j+len],如果相等的话,就让len++。
如果s[i+len]>s[j+len],我们可以直接让i移到i+len+1,因为在i->i+len这段区间里,都不会使得获得的字符串最小。
如果s[i+len]<s[j+len],我们可以让j移动到j+len+1,这样的话,在j->j+len这段区间里,也都不会使得获得的字符串字典序最小。
https://blog.csdn.net/qq_37369394/article/details/78418391
AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 # define ll long long 4 const int maxn =2e5+10; 5 char str[maxn]; 6 int get_min() 7 { 8 int len=strlen(str); 9 int i=0,j=1,k=0; 10 while(i<len&&j<len&&k<len) 11 { 12 int t=str[(i+k)%len]-str[(j+k)%len]; 13 // cout<<t<<endl; 14 if(t==0) 15 k++; 16 else 17 { 18 if(t>0) 19 { 20 i+=k+1; 21 } 22 else 23 { 24 j+=k+1; 25 } 26 if(i==j)j++; 27 k=0; 28 } 29 } 30 return min(i,j); 31 } 32 int main() 33 { 34 int T; 35 scanf("%d",&T); 36 while(T--) 37 { 38 scanf("%s",str); 39 int ans=get_min()+1; 40 printf("%d ",ans); 41 } 42 return 0; 43 } 44