• 洛谷1368 工艺


    题意:输入一个串,通过环形变换使它最小。(n<=300000)

    裸的后缀排序啊!

    (卡常把命都卡掉了)

    后缀数组记得开大啊

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int x[1200005],y[1200005],u[1200005],v[1200005],r[1200005],o[1200005],n,m=700000;
     5 int str[600005],buf[600005];
     6 
     7 int main(){
     8     scanf("%d",&n);
     9     for(int i=1;i<=n;i++) scanf("%d",&str[i]),buf[i]=str[i];
    10     sort(buf+1,buf+n+1);
    11     for(int i=1;i<=n;i++) str[i]=lower_bound(buf+1,buf+n+1,str[i])-buf;
    12     for(int i=1;i<=n;i++) str[i+n]=str[i];
    13     
    14     n*=2;
    15     
    16     for(register int i=1;i<=n;i++) u[str[i]]++;
    17     for(register int i=1;i<=m;i++) u[i]+=u[i-1];
    18     for(register int i=n;i>=1;i--) x[u[str[i]]--]=i;
    19     r[x[1]]=1;
    20     for(int i=2;i<=n;i++) r[x[i]]=r[x[i-1]]+(str[x[i]]!=str[x[i-1]]);
    21     
    22     for(int l=1;r[x[n]]<n;l<<=1) {
    23         memset(u,0,sizeof u);
    24         memset(v,0,sizeof v);
    25         memcpy(o,r,sizeof r);
    26         for(register int i=1;i<=n;i++) u[r[i]]++, v[r[i+l]]++;
    27         for(register int i=1;i<=n;i++) u[i]+=u[i-1], v[i]+=v[i-1];
    28         for(register int i=n;i>=1;i--) y[v[r[i+l]]--]=i;
    29         for(register int i=n;i>=1;i--) x[u[r[y[i]]]--]=y[i];
    30         r[x[1]]=1;
    31         for(register int i=2;i<=n;i++)
    32             r[x[i]]=r[x[i-1]]+((o[x[i]]!=o[x[i-1]])||(o[x[i]+l]!=(o[x[i-1]+l])));
    33     }
    34     
    35     for(int i=1;i<=n;i++) 
    36         if(x[i]<=n/2) {
    37             for(register int j=1;j<=n/2;j++) printf("%d ",buf[str[x[i]+j-1]]);
    38             return 0;
    39         }
    40 }
  • 相关阅读:
    UML中常用的类图元素介绍
    灵魂架构师论坛 正在崛起
    什么是模式,什么是框架
    RPG Maker XP
    php常用HEADER头记录
    PHP MYSQLI扩展库面向对象编程 数据库连接 例子
    PHP 通过MYSQL扩展库 连接MYSQL例子
    MYSQL 数据库相关操作总结
    MYSQL 客户端控制台 中文乱码
    PHP 安全编程慢慢总结
  • 原文地址:https://www.cnblogs.com/mollnn/p/8449690.html
Copyright © 2020-2023  润新知