ZOJ 1729 Hidden Password (字符串最小表示)

以前听过,不知道是什么,其实就是字符串首尾相连成一个环,n种切法求一个字典序最小的表示。

朴素算法大家都懂。O(n)的算法代码非常简单,最主要的思想是失配的时候尽可能大的移动指针。

另外附上一个不错的字符串算法总结:http://duanple.blog.163.com/blog/static/709717672009825004092/

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e5+5;
char s[maxn];

int main()
{
    //freopen("in.txt","r",stdin);
    int T; scanf("%d",&T);
    while(T--){
        int n; scanf("%d",&n);
        scanf("%s",s);
        int i = 0,j = 1, k = 0;
        while(i<n && j<n && k<n){
            int x = (i+k)%n, y = (j+k)%n;
            if(s[x] != s[y]){
                if(s[x] > s[y]) i += k+1;//如果不移动到这里,另外一边一定存在一个更小的前缀
                else j += k+1;
                k = 0;
            }else k++;
            if(i == j) j++;
        }
        printf("%d\n",i);
    }
    return 0;
}

 

posted @ 2015-09-15 20:29  陈瑞宇  阅读(283)  评论(0编辑  收藏  举报