题目链接:http://poj.org/problem?id=1509
这个题目开始以为是后缀数组,拼接同一个串然后求排名,这样来计算
也没想到还有这么一个算法,可以直接求出字符串的最小表示方法,学习了,不过理解还不是很深刻
这个算法实现起来比较简单,如果理解为就是这样,记住就行了,那还是比较好理解的
但是如果真正想纠结于具体细节等还是比较绕人的!
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
#define maxn 210000
char str[maxn];
int n;
int get_min(char *name,int len)
{
int i=0,j=1,k=0;
int t;
while(i<len && j<len && k<len)
{
t=name[i+k < len ? i+k : i+k-len]-name[j+k < len ? j+k : j+k-len];
if(t==0)
k++;
else
{
if(t>0)
i=i+k+1;
else
j=j+k+1;
if(i==j)//如果后面的加k那么就可能出现这种情况
j++;
k=0;
}
}
return i < j ? i: j;
}
int main()
{
int t;
int i,j,k;
scanf("%d",&t);
while(t--)
{
scanf("%s",str);
n=strlen(str);
printf("%d\n",get_min(str,n)+1);
}
return 0;
}