字符串专项:LA 2755
2013-07-02 23:42
99 查看
这题一开始没什么想法,貌似可以用类似后缀数组的方法求,可是对实现后缀数组基数排序理解不够深,也不会写。后来看别人的代码,发现了一个简单而又高效的方法。
应该算是扫描线吧,用两个指针,一个指向当前最优的串的首字母,另一个指向待比较的串的首字母,然后分3种情况讨论,这里还有一个记录前缀相同的长度的量。这里利用了一个性质,即比较过后的字符,如果不是最优,就一定不是最优了,所以指针不会回溯。这样时间复杂度就降到了O(n)。
应该算是扫描线吧,用两个指针,一个指向当前最优的串的首字母,另一个指向待比较的串的首字母,然后分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; }
相关文章推荐
- 字符串专项:LA 5913
- LA 2755 Hidden Password(字符串最小表示法)
- 字符串专项:LA 3490
- 字符串专项:LA 4126
- 字符串专项:UVa 11855
- 刷题笔记:牛客字符串专项练习5
- 数学专项counting:LA 4064
- 数学专项number_theory:LA 2955
- hdu5745 La Vie en rose (字符串)
- LA 4513 Stammering Aliens(字符串hash)
- LA 4513 hash表示字符串后缀
- 刷题笔记:牛客字符串专项练习3
- 搜索专项:LA 5844
- 字符串专项:Ural 1723
- 刷题笔记:牛客字符串专项练习1
- LA 2755 Hidden Password
- 字符串专项:Ural 1102
- UVALive 2755 Hidden Password(字符串最小表示)
- 高效算法设计专项:LA 2689
- 字符串专项:hdu 2825