您的位置:首页 > 其它

字符串专项:LA 2755

2013-07-02 23:42 99 查看
这题一开始没什么想法,貌似可以用类似后缀数组的方法求,可是对实现后缀数组基数排序理解不够深,也不会写。后来看别人的代码,发现了一个简单而又高效的方法。

应该算是扫描线吧,用两个指针,一个指向当前最优的串的首字母,另一个指向待比较的串的首字母,然后分3种情况讨论,这里还有一个记录前缀相同的长度的量。这里利用了一个性质,即比较过后的字符,如果不是最优,就一定不是最优了,所以指针不会回溯。这样时间复杂度就降到了O(n)。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n;
char str[200010];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%s",&n,str);
char tmp[100010];
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: