zoukankan      html  css  js  c++  java
  • 最小表示法模板(洛谷P1368 工艺)(最小表示法)

    洛谷题目传送门

    最小表示是指一个字符串通过循环位移变换(第一个移到最后一个)所能得到的字典序最小的字符串。

    因为是环状的,所以肯定要先转化为序列,把原串倍长。

    设决策点为一个表示法的开头。比较两个决策点(i,j),找到它们的LCP(假设长度为(k))。

    假设(s_{i+k}>s_{j+k}),那么显然决策(s_{i...i+k})是分别不优于决策(s_{j...j+k})的,直接跳过这一部分即可。(s_{i+k}<s_{j+k})同理。

    时间复杂度(O(n))

    #include<bits/stdc++.h>
    #define LL long long
    #define RG register
    #define R RG int
    #define G if(++ip==ie)fread(ip=buf,1,SZ,stdin)
    using namespace std;
    const int SZ=1<<19,N=6e5+9;
    int a[N];
    char buf[SZ],*ie=buf+SZ,*ip=ie-1;
    inline int in(){
        G;while(*ip<'-')G;
        R x=*ip&15;G;
        while(*ip>'-'){x*=10;x+=*ip&15;G;}
        return x;
    }
    int main(){
        R n=in(),i,j,k;
        for(i=0;i<n;++i)a[i]=a[i+n]=in();
        for(i=j=0;i<n&&j<n;(a[i+k]>a[j+k]?i:j)+=k+1){//跳过无用决策
            if(i==j)++j;//注意特判
            for(k=0;k<n&&a[i+k]==a[j+k];++k);//找LCP
        }
        for(i=min(i,j),j=i+n;i<j;++i)
            printf("%d ",a[i]);
        puts("");
        return 0;
    }
    
  • 相关阅读:
    flask读书笔记-flask web开发
    flask 杂记
    ubuntu redis 安装 &基本命令
    redis 订阅&发布(转载)
    Redis键值设计(转载)
    python2 python3区别
    捕获异常
    开源的微信个人号接口
    工具
    HDU2966 In case of failure(浅谈k-d tree)
  • 原文地址:https://www.cnblogs.com/flashhu/p/9940962.html
Copyright © 2011-2022 走看看