最小表示法 学习笔记

理解

若s[x..x+k-1]同s[y...y+k-1]
s[x+k]<s[y+k],则所有z<=k
都有s[x+z....x+k]<s[y+z.....y+k]
所以y....y+k都不可能作为最小表示法的左端点

先粘一波Sdchr的代码(稍微改了点)

int n;
char s[N<<1];

int Solve(void){
    int x=1,y=2,k=0;
    repu(i,1,n) s[i+n]=s[i];//倍长
    while (x<=n&&y<=n&&k<=n){
        int t=s[x+k]-s[y+k];
        if (s[x+k]==s[y+k]) k++;
        else{
            if (s[y+k]>s[x+k]) y+=k+1;
            else x+=k+1;
            if (x==y) y++;
            k=0;
        }
    }
    return min(x,y);
}
posted @ 2017-02-17 20:49  _zwl  阅读(122)  评论(0编辑  收藏  举报