E 最小的小号(bupt323)
从位置i开始长为l的字符和从位置j开始长为l的字符串比较
#include<iostream>
#include<cstring>
#define N 100005
using namespace std;
char s[N];
int l,len;
int scmp(int i,int j,int flg)
{
int k;
if(flg==0)
{
for(k=0;k<l;k++)
{
if( s[(i+k)%len]<s[(k+j)%len]) return -1;
else if(s[(i+k)%len]>s[(k+j)%len]) return 1;
}
return 0;
}
else
{
if( s[(i+l-1)%len]<s[(j+l-1)%len]) return -1;
else if(s[(i+l-1)%len]>s[(j+l-1)%len]) return 1;
else return 0;
}
}
int main()
{
int t,i,temp,j,flg;
cin>>t;
while(t--)
{
cin>>s;l=0;
len=strlen(s);
i=0;j=1;l=1;
flg=0;//两个字符串不相等flg=0;
while(j<len&&l<len)
{
temp=scmp(i,j,flg);
if(temp==0) { l++;flg=1;}
else if(temp==1)
{
i=j;j++;
flg=0;
}else if(temp==-1)
{
if(flg==1)
j+=l;
else
j++;
flg=0;
}
}
for(j=0;j<len;j++)
{
printf("%c",s[(i+j)%len]);
}
cout<<endl;
}
return 0;
}