洛谷 P2870 [USACO07DEC]Best Cow Line G(后缀数组)
admin
2024-02-09 11:50:20
0

[USACO07DEC]Best Cow Line G

题目背景

本题和 2007 年 11 月月赛银组同名题目 在题意上一致,唯一的差别是数据范围。

题目描述

Farmer John 打算带领 NNN(1≤N≤5×1051 \leq N \leq 5 \times 10^51≤N≤5×105)头奶牛参加一年一度的”全美农场主大奖赛“。在这场比赛中,每个参赛者必须让他的奶牛排成一列,然后带领这些奶牛从裁判面前依此走过。

今年,竞赛委员会在接受报名时,采用了一种新的登记规则:取每头奶牛名字的首字母,按照它们在队伍中的次序排成一列。将所有队伍的名字按字典序升序排序,从而得到出场顺序。

FJ 由于事务繁忙,他希望能够尽早出场。因此他决定重排队列。

他的调整方式是这样的:每次,他从原队列的首端或尾端牵出一头奶牛,将她安排到新队列尾部。重复这一操作直到所有奶牛都插入新队列为止。

现在请你帮 FJ 算出按照上面这种方法能排出的字典序最小的队列。

输入格式

第一行一个整数 NNN。

接下来 NNN 行每行一个大写字母,表示初始队列。

输出格式

输出一个长度为 NNN 的字符串,表示可能的最小字典序队列。

每输出 808080 个字母需要一个换行。

样例 #1

样例输入 #1

6
A
C
D
B
C
B

样例输出 #1

ABCBCD
1、原字符串 ACDBCB, 反字符串 BCBDCA, 字符串长度为n拼接起来 ACDBCBBCBDCA, 字符串长度为 2n, 求拼接字符串的后缀数组sa, rk.
2、 得到数组 rk 后, 双指针 i, j 遍历数组 rk, 1 <= i <= n, n + 1 <= j <= 2n, rk[i] < rk[j], 说明从头选一个字符,rk[i] > rk[j], 说明从尾选一个字符
#include 
using namespace std;
const int N = 2e6 + 10;char s[N];
char ans[N];
int len;
int n, m;	//n是后缀个数, m是桶的个数
int x[N];	//桶数组
int y[N];	//辅助数组
int c[N];	//计数数组
int sa[N];	//sa[k] 表示排名为k的数组后缀编号
int rk[N];	//rk[k] 表示后缀字符串k 的排名
int height[N];	// heght[k] = lcp(sa[i], sa[i - 1])void get_sa()
{int i, k;// 按第一个字母排序for(i = 1; i <= n; ++i)	// 按第一个字母编桶号, 并累计c[(x[i] = s[i])]++;for(i = 1; i <= m; ++i)	c[i] += c[i - 1];for(i = n; i; --i)		//后缀i的排序是i 所在桶号的剩余累计值sa[c[x[i]]--] = i;for(k = 1; k <= n; k <<= 1)	// logn 轮{// 按第二关键字排序memset(c, 0, sizeof c);for(i = 1; i <= n; ++i)	y[i] = sa[i];for(i = 1; i <= n; ++i)	c[x[y[i] + k]]++;for(i = 1; i <= m; ++i) c[i] += c[i - 1];for(i = n; i; i--) sa[c[x[y[i] + k]]--] = y[i];//按第一关键字排序memset(c, 0, sizeof c);for(i = 1; i <= n; ++i)	y[i] = sa[i];for(i = 1; i <= n; ++i)	c[x[y[i]]]++;for(i = 1; i <= m; ++i)	c[i] += c[i - 1];for(i = n; i; --i)	sa[c[x[y[i]]]--] = y[i];//把后缀放入桶数组for(i = 1; i <= n; ++i)	y[i] = x[i];for(m = 0, i = 1; i <= n; ++i){if(y[sa[i]] == y[sa[i - 1]] && y[sa[i] + k] == y[sa[i - 1] + k])x[sa[i]] = m;elsex[sa[i]] = ++m;	// 相邻后缀的关键字不相等则放入新桶}if(m == n)	break;}
}// 定理 height[rk[i]] >= height[rk[i - 1]] - 1;
void get_height()
{for(int i = 1; i <= n; ++i)rk[sa[i]] = i;for(int i = 1, k = 0; i <= n; ++i)	//枚举后缀i{if(rk[i] == 1)	continue;		//第一名height 为0if(k) k--;						//上一个后缀的height 值减 1int j = sa[rk[i] - 1];			//找出后缀i的前邻后缀 jwhile(i + k <= n && j + k <= n && s[i + k] == s[j + k])k++;height[rk[i]] = k;}
}int main()
{scanf("%d", &n);char ch[10];for(int i = 1; i <= n; ++i){scanf("%s", ch);s[i] = ch[0];}for(int i = 1; i <= n; ++i)s[2 * n + 1 - i] = s[i];n *= 2;m = 90;get_sa();for(int i = 1; i <= n; ++i)rk[sa[i]] = i;int i = 1, j = 1, step = n / 2;for(int k = 1; k <= step; ++k){if(rk[i] < rk[step + j]){ans[++len] = s[i];//	printf("%c", s[i]);	++i;}else{ans[++len] = s[step + j];//	printf("%c", s[step + j]);	++j;}}for(int i = 1; i <= len; ++i){printf("%c", ans[i]);if(i % 80 == 0)printf("\n");}
//	printf("\n");return 0;
}

相关内容

热门资讯

电视安卓系统哪个品牌好,哪家品... 你有没有想过,家里的电视是不是该升级换代了呢?现在市面上电视品牌琳琅满目,各种操作系统也是让人眼花缭...
安卓会员管理系统怎么用,提升服... 你有没有想过,手机里那些你爱不释手的APP,背后其实有个强大的会员管理系统在默默支持呢?没错,就是那...
安卓系统软件使用技巧,解锁软件... 你有没有发现,用安卓手机的时候,总有一些小技巧能让你玩得更溜?别小看了这些小细节,它们可是能让你的手...
安卓系统提示音替换 你知道吗?手机里那个时不时响起的提示音,有时候真的能让人心情大好,有时候又让人抓狂不已。今天,就让我...
安卓开机不了系统更新 手机突然开不了机,系统更新还卡在那里,这可真是让人头疼的问题啊!你是不是也遇到了这种情况?别急,今天...
安卓系统中微信视频,安卓系统下... 你有没有发现,现在用手机聊天,视频通话简直成了标配!尤其是咱们安卓系统的小伙伴们,微信视频功能更是用...
安卓系统是服务器,服务器端的智... 你知道吗?在科技的世界里,安卓系统可是个超级明星呢!它不仅仅是个手机操作系统,竟然还能成为服务器的得...
pc电脑安卓系统下载软件,轻松... 你有没有想过,你的PC电脑上安装了安卓系统,是不是瞬间觉得世界都大不一样了呢?没错,就是那种“一机在...
电影院购票系统安卓,便捷观影新... 你有没有想过,在繁忙的生活中,一部好电影就像是一剂强心针,能瞬间让你放松心情?而我今天要和你分享的,...
安卓系统可以写程序? 你有没有想过,安卓系统竟然也能写程序呢?没错,你没听错!这个我们日常使用的智能手机操作系统,竟然有着...
安卓系统架构书籍推荐,权威书籍... 你有没有想过,想要深入了解安卓系统架构,却不知道从何下手?别急,今天我就要给你推荐几本超级实用的书籍...
安卓系统看到的炸弹,技术解析与... 安卓系统看到的炸弹——揭秘手机中的隐形威胁在数字化时代,智能手机已经成为我们生活中不可或缺的一部分。...
鸿蒙系统有安卓文件,畅享多平台... 你知道吗?最近在科技圈里,有个大新闻可是闹得沸沸扬扬的,那就是鸿蒙系统竟然有了安卓文件!是不是觉得有...
宝马安卓车机系统切换,驾驭未来... 你有没有发现,现在的汽车越来越智能了?尤其是那些豪华品牌,比如宝马,它们的内饰里那个大屏幕,简直就像...
p30退回安卓系统 你有没有听说最近P30的用户们都在忙活一件大事?没错,就是他们的手机要退回安卓系统啦!这可不是一个简...
oppoa57安卓原生系统,原... 你有没有发现,最近OPPO A57这款手机在安卓原生系统上的表现真是让人眼前一亮呢?今天,就让我带你...
安卓系统输入法联想,安卓系统输... 你有没有发现,手机上的输入法真的是个神奇的小助手呢?尤其是安卓系统的输入法,简直就是智能生活的点睛之...
怎么进入安卓刷机系统,安卓刷机... 亲爱的手机控们,你是否曾对安卓手机的刷机系统充满好奇?想要解锁手机潜能,体验全新的系统魅力?别急,今...
安卓系统程序有病毒 你知道吗?在这个数字化时代,手机已经成了我们生活中不可或缺的好伙伴。但是,你知道吗?即使是安卓系统,...
奥迪中控安卓系统下载,畅享智能... 你有没有发现,现在汽车的中控系统越来越智能了?尤其是奥迪这种豪华品牌,他们的中控系统简直就是科技与艺...