1,题意:将一个字符串首尾连接,找出字典排序最小的字符串.
2,解决:
初始化连个位置p=0,q=1,往后扫描tp,tq分别记录扫描位置.
如果s[tp]<s[tq],那么q=tq+1;
如果s[tp]>s[tq],那么p=tp+1;
同时保证q大于p,扫描一次得到的p,既是开始的位置.
3,实现代码
2,解决:
初始化连个位置p=0,q=1,往后扫描tp,tq分别记录扫描位置.
如果s[tp]<s[tq],那么q=tq+1;
如果s[tp]>s[tq],那么p=tp+1;
同时保证q大于p,扫描一次得到的p,既是开始的位置.
3,实现代码
#include <iostream>
using namespace std;
#define MAX 20010 //串的最大长度
char str[MAX];
char str2[MAX]; //辅助串
int main()
{
freopen("5.20.in","r",stdin);
int cnt;
long p,q,tp,tq,len;
cin>>cnt;
while(cnt--)
{
cin>>str;
len=strlen(str);
for(int i=0;i<len;i++)
str2[i]=str2[i+len]=str[i];
p=0;
q=1;
cout<<len<<endl;
while(q<len)
{
tp=p;
tq=q;
while(tp-p<len)
{
if(str2[tp]==str2[tq]) tp++,tq++;
else if(str2[tp]<str2[tq])
{
q=tq+1;
break;
}
else
{
p=tp+1;
if(p>=q) q=p+1; //始终保证q在p后面
break;
}
}
if(tp-p==len) break;
}
for(int i=0;i<len;i++)
cout<<str2[p+i];
cout<<endl;
}
return 0;
}