题目链接: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代码:
#include <bits/stdc++.h>
using namespace std;
# define ll long long
const int maxn =2e5+10;
char str[maxn];
int get_min()
{
int len=strlen(str);
int i=0,j=1,k=0;
while(i<len&&j<len&&k<len)
{
int t=str[(i+k)%len]-str[(j+k)%len];
// cout<<t<<endl;
if(t==0)
k++;
else
{
if(t>0)
{
i+=k+1;
}
else
{
j+=k+1;
}
if(i==j)j++;
k=0;
}
}
return min(i,j);
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",str);
int ans=get_min()+1;
printf("%d\n",ans);
}
return 0;
}