题意:一个长度为n的串,它可以按位循环左移,问变成最小字典序的字符串需要左移多少次。
据说后缀数组要TLE。正解是“字符串最小表示” PPT在:http://download.csdn.net/detail/moon_no2015/9006921可以免费下载。
代码很简单,至于为什么,看PPT吧。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define nn 200200
char str[nn],tmp[nn];
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d%s",&n,str);
strcpy(tmp,str);
strcat(str,tmp);
int k=0,l=0,p=1;
while(p<n&&k+l+1<n)
{
if(str[p+l]==str[k+l]) l++;
if(str[k+l]<str[p+l])
{
p=p+l+1;
l=0;
}
if(str[k+l]>str[p+l])
{
int h=max(p,k+l+1);
k=h;
p=h+1;
l=0;
}
}
printf("%d\n",k);
}
return 0;
}